PHP разделяет содержимое при обнаружении HTML-элемента - PullRequest
0 голосов
/ 27 мая 2010

У меня есть переменная PHP, которая содержит некоторый HTML-код. Я хочу иметь возможность разбить переменную на две части, и я хочу, чтобы разлив имел место при обнаружении второго жирного шрифта <strong> or <b>, особенно если у меня есть содержимое, которое выглядит как это,

Мой контент
Это мой контент. Еще немного жирного содержимого, которое вылилось бы в другую переменную.

это вообще возможно?

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Примерно так будет работать:

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

Учитывая вашу тестовую строку:

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

вы бы в итоге получили

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

Теперь, если ваша примерная строка НЕ ​​начиналась с strong / 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
)

и простой тест, чтобы увидеть, является ли элемент № 0 тегом или текстом, чтобы определить, где начинается ваш текст «второй тег и далее» (элемент № 3 или элемент № 4)

0 голосов
/ 27 мая 2010

Если вам действительно нужно разделить строку, подход с использованием регулярных выражений может сработать. Однако при разборе HTML существует множество уязвимостей.

Если вы просто хотите знать второй узел, который имеет тег strong или b, использовать DOM намного проще. Код не только очевиден, но и все биты разбора позаботятся о вас.

<?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
}
0 голосов
/ 27 мая 2010

Это возможно с «положительным взглядом» в регулярных выражениях. Например, (?<=a)b соответствует b (и только b) в cab, но не соответствует bed или debt.

В вашем случае, (?<=(\<strong|\<b)).*(\<strong|\<b) должен добиться цели. Используйте это регулярное выражение в вызове preg_split() и обязательно установите PREG_SPLIT_DELIM_CAPTURE, если хотите, чтобы эти теги <b> или <strong> были включены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...