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); 

  • Создайте группу захвата в <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 и регулярных выражений (regex on text() и т. Д. Поддерживаются только с XPath 2.0 ).
Шаги:

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