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).
Шаги:

  1. Сначала загрузите DOM
  2. Получить все p теги через запрос xpath
  3. Если значение 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 структура в целом.

Другие вопросы по тегам