2010-05-27 9 views
0

J'ai une variable PHP qui contient du code HTML, je veux être capable de diviser la variable en deux morceaux, et je veux que le déversement ait lieu quand un second <strong> or <b> gras est trouvé, essentiellement si j'ai le contenu qui ressemble à ceci,PHP fractionner le contenu quand un élément HTML est trouvé

mon contenu
Ceci est mon contenu. Contenu plus audacieux, qui se serait renversé dans une autre variable.

est-ce possible?

Répondre

1

Quelque chose comme ceci essentiellement travailler:

preg_split('/(<strong>|<b>)/', $html1, 3, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

Compte tenu de votre chaîne de test:

$html1 = '<strong>My content</strong>This is my content.<b>Some more bold</b>content'; 

vous finiriez avec

Array (
    [0] => <strong> 
    [1] => My content</strong>This is my content. 
    [2] => <b> 
    [3] => Some more bold</b>content 
) 

Maintenant, si votre chaîne d'échantillon n'a pas commencé avec fort/b:

$html2 = 'like the first, but <strong>My content</strong>This is my content.<b>Some more bold</b>content, has some initial none-tag content'; 

Array (
    [0] => like the first, but 
    [1] => <strong> 
    [2] => My content</strong>This is my content. 
    [3] => <b> 
    [4] => Some more bold</b>content, has some initial none-tag content 
) 

et un simple test pour voir si l'élément # 0 est soit une étiquette ou d'un texte pour déterminer où votre « deuxième étiquette et les années suivantes » commence texte (élément # 3 ou élément # 4)

+0

serait-il possible de placer les divisions dans leur propre 'div' –

0

Il est possible 'lookbehind positif' dans les expressions régulières. Par exemple, (?<=a)b correspond au b (et seulement le b) dans cab, mais ne correspond pas bed ou debt.

Dans votre cas, (?<=(\<strong|\<b)).*(\<strong|\<b) devrait faire l'affaire. Utilisez cette expression régulière dans un appel preg_split() et assurez-vous de définir PREG_SPLIT_DELIM_CAPTURE si vous souhaitez inclure les balises <b> ou <strong>.

0

Si vous avez réellement besoin de diviser la chaîne, l'approche de l'expression régulière peut fonctionner. Cependant, il y a beaucoup de fragilités à propos de l'analyse HTML.

Si vous voulez juste connaître le deuxième noeud qui a une étiquette strong ou b, l'utilisation d'un DOM est tellement plus facile. Non seulement le code est très évident, mais tous les bits d'analyse sont pris en charge pour vous.

<?php 

$testHtml = '<p><strong>My content</strong><br> 
This is my content. <strong>Some more bold</strong> content, that would spilt into another variable.</p> 
<p><b>This should not be found</b></p>'; 

$htmlDocument = new DOMDocument; 

if ($htmlDocument->loadHTML($testHtml) === false) { 
    // crash and burn 
    die(); 
} 

$xPath = new DOMXPath($htmlDocument); 
$boldNodes = $xPath->query('//strong | //b'); 

$secondNodeIndex = 1; 

if ($boldNodes->item($secondNodeIndex) !== null) { 
    $secondNode = $boldNodes->item($secondNodeIndex); 
    var_dump($secondNode->nodeValue); 
} else { 
    // crash and burn 
} 
Questions connexes