2016-03-15 2 views
-2

Я хочу добавить класс в <p>, если он соответствует следующему выражению, используя preg_replace.preg_replace разрезает первую букву строки

Следующий код делает это, однако, разрезает первую букву строки (язык rtl). Обратите внимание на слово ہور, первый символ ہ вырезается. Как это можно исправить?

$str = "<p>para 1</p><p> ہور سنا کنجڑا </p><p>para3</p>"; 
$result = preg_replace("~\p{Arabic}~u", "<p class=\"foo\">", $str, 1); 

echo $result; 

//output 
<p>para 1</p><p> <p class="foo">ور سنا کنجڑا </p><p>para3</p> 

Demo

+1

Просьба избегать [двойных проводок] (http://stackoverflow.com/questions/36018872/preg-match-all-paragraphs-in-a-string) (не был ли один из ответов в соответствии с вашими потребностями?) – Jan

+0

@Jan это был совершенно другой вопрос, поэтому я разместил здесь, поскольку я помню, как читал в другом ответе здесь, что вы не должны задавать несколько вопросов в одном потоке. – sam

ответ

2

Group найденный символ.

$str = "<p>para 1</p><p> ہور سنا کنجڑا </p><p>para3</p>"; 
$result = preg_replace("~(\p{Arabic})~u", "<p class=\"foo\">$1", $str, 1); 
echo $result; 

() захватывает найденный арабский характер.
$1 добавляет его обратно в заменую строку.

Regex Demo: https://regex101.com/r/yN5vW3/1 vs. https://regex101.com/r/yN5vW3/2
PHP Demo: https://eval.in/537056

+0

OP отправил очень [тот же вопрос дважды] (http://stackoverflow.com/questions/36018872/preg-match-all-paragraphs-in-a-string) – Jan

+1

И нет необходимости использовать группы захвата с '$ 0'. backreferences весь матч. –

2

preg_replace() не "вырезать" первая буква строки. Он заменяет его строкой, которую вы передаете в качестве второго аргумента. Это то, что preg_replace() делает для жизни; он заменяет фрагменты строк :-)

Существует несколько способов сказать, что вы делаете. Можно, например, использовать sub-string that matches в замене() строку:

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

Или вы можете использовать assertion:

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

Во всяком случае, то, что вы, вероятно, нужно заменить <p> с <p class="foo"> когда это в абзаце содержатся арабские слова. Изменения кода, которые я предложил выше, уже используют это предположение.

Смежные вопросы