Следующая строка содержит несколько тегов <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
).
Шаги:
Это фактический код:
<?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
в целом.