2016-06-12 3 views
1

Я хочу добавить класс ко всем p тегам, которые содержат в себе арабский текст. Например:заменить все вхождения строки

<p>لمبارة وذ</p> 
<p>do nothing</p> 
<p>خمس دقائق يخ</p> 
<p>مراعاة إبقاء 3 لاعبين</p> 

должен стать

<p class="foo">لمبارة وذ</p> 
<p>do nothing</p> 
<p class="foo">خمس دقائق يخ</p> 
<p class="foo">مراعاة إبقاء 3 لاعبين</p> 

Я пытаюсь использовать PHP preg_replace функцию, чтобы соответствовать шаблону (арабский) с выражением:

preg_replace("~(\p{Arabic})~u", "<p class=\"foo\">$1", $string, 1); 

Однако он не работает должным образом. Он имеет две проблемы:

  1. Это соответствует только первый абзац.
  2. Добавляет пустой <p>.

Песочница Link

+0

Что делать, если это не арабский? –

+0

@SimonKirsten, тогда это должно быть так, как есть. Я редактировал пример в вопросе, пожалуйста, смотрите. – sam

ответ

3

Это соответствует только первый абзац.

Это потому, что вы добавили последний аргумент, указав, что хотите заменить только первое вхождение. Оставьте этот аргумент.

Добавляет пустой <p>.

Это на самом деле оригинал <p>, с которым вы не соглашались. Просто добавьте его в соответствующий шаблон, но сохраните его за пределами соответствующей группы, поэтому он будет оставлен при замене $1.

Вот исправленная версия, а также на sandbox:

$text = preg_replace("~<p>(\p{Arabic}+)~u", "<p class=\"foo\">$1", $string); 
+0

Спасибо, но я вижу точно такие же проблемы на выделенной песочнице. Вы уверены, что его правильная ссылка? – sam

+0

неправильная ссылка: это он: http://sandbox.onlinephpfunctions.com/code/747ba3b5676602ba4d0aea787d7d0fb1457b3ffd – trincot

2

Ваша первая проблема заключается в том, что вы не говорили это, чтобы соответствовать <p>, так что это не так.

Ваша основная проблема заключается в том, что пробелы не являются арабскими. Просто добавив альтернативу, чтобы соответствовать их исправляет проблему:

$text = preg_replace("~<p>(\p{Arabic}*|\s*)~u", "<p class=\"foo\">$1", $string); 
2

Использование DOMDocument и DOMXPath:

$html = <<<'EOD' 
<p>لمبارة وذ</p> 
<p>خمس دقائق يخ</p> 
<p>مراعاة إبقاء 3 لاعبين</p> 
EOD; 

libxml_use_internal_errors(true); 

$dom = new DOMDocument; 
$dom->loadHTML('<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED); 

$xpath = new DOMXPath($dom); 

// here you register the php namespace and the preg_match function 
// to be able to use it in the XPath query 
$xpath->registerNamespace("php", "http://php.net/xpath"); 
$xpath->registerPhpFunctions('preg_match'); 

// select only p nodes with at least one arabic letter 
$pNodes = $xpath->query("//p[php:functionString('preg_match', '~\p{Arabic}~u', .) > 0]"); 

foreach ($pNodes as $pNode) { 
    $pNode->setAttribute('class', 'foo'); 
} 

$result = ''; 
foreach ($dom->documentElement->childNodes as $childNode) { 
    $result .= $dom->saveHTML($childNode); 
} 

echo $result; 
Смежные вопросы