preg_match все параграфы в строке
Следующая строка содержит несколько <p>
теги. Я хочу сопоставить содержимое каждого из <p>
с шаблоном, и если он совпадает, я хочу добавить класс CSS к этому конкретному абзацу.
Например, в следующей строке соответствует только содержимое второго абзаца, поэтому я хочу добавить класс только к этому абзацу.
$string = '<p>para 1</p><p>نص عربي أو فارسي</p><p>para3</p>';
С помощью следующего кода я могу сопоставить все строки, но я не могу понять, как найти конкретный абзац.
$rtl_chars_pattern = '/[\x{0590}-\x{05ff}\x{0600}-\x{06ff}]/u';
$return = preg_match($rtl_chars_pattern, $string);
2 ответа
- Создать группу захвата на
<p>
тег - использование
preg_replace
https://regex101.com/r/nE5pT1/1
$str = "<p>para 1</p><p>نص عربي أو فارسي</p><p>para3</p>";
$result = preg_replace("/(<p>)[\\x{0590}-\\x{05ff}\\x{0600}-\\x{06ff}]/u", "<p class=\"foo\">", $str, 1);
Используйте комбинацию SimpleXML
, XPath
и регулярные выражения (регулярное выражение на text()
и т. д. поддерживаются только с XPath 2.0
).
Шаги:
- Сначала загрузите DOM
- Получить все
p
теги через запрос xpath - Если значение text / node соответствует вашему регулярному выражению, примените класс css
Это фактический код:
<?php
$html = "<html><p>para 1</p><p>نص عربي أو فارسي</p><p>para3</p></html>";
$xml = simplexml_load_string($html);
# query the dom for all p tags
$ptags = $xml->xpath("//p");
# your regex
$regex = '~[\x{0590}-\x{05ff}\x{0600}-\x{06ff}]~u';
# alternatively:
# $regex = '~\p{Arabic}~u';
# loop over the tags, if the regex matches, add another attribute
foreach ($ptags as &$p) {
if (preg_match($regex, (string) $p))
$p->addAttribute('class', 'some cool css class');
}
# just to be sure the tags have been altered
echo $xml->asXML();
?>
Смотрите демо на ideone.com. Преимущество кода состоит в том, что вы анализируете только содержимое p
тег, а не DOM
структура в целом.