2016-03-15 48 views
-2

如果想要使用preg_replace匹配以下表达式,我想添加一个类到<p>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

请避免[double postings](http://stackoverflow.com/questions/36018872/preg-match-all-paragraphs-in-a-string)(没有一个答案适合您的需求?) – Jan

+0

@Jan这是一个完全不同的问题,这就是为什么我在这里张贴,因为我记得在这里读一些其他的答案,你不应该问同一个线程的多个问题。 – sam

回答

2

集团找到字符。

$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将其添加回替换字符串中。

正则表达式演示:https://regex101.com/r/yN5vW3/1https://regex101.com/r/yN5vW3/2
PHP演示:https://eval.in/537056

+0

OP发布了非常[相同的问题两次](http://stackoverflow.com/questions/36018872/preg-match-all-paragraphs-in-a-string) – Jan

+1

而且没有必要使用捕获组,因为'$ 0'反向引用整个比赛。 –

2

preg_replace()不 “一刀切” 的字符串的第一个字母。它将它作为第二个参数传递给它的字符串替换。这就是preg_replace()所做的一切;它取代了字符串的片段:-)

有几种方法可以告诉它你做了什么。你可以,例如,使用sub-string that matches到replacement()字符串:

$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 class="foo">何时更换<p>该段落包含阿拉伯词汇。我上面提出的代码更改已经利用了这个假设。

相关问题