preg_replace 剪切字符串的第一个字母

preg_replace cuts first letter of the string

如果 class 使用 preg_replace 匹配以下表达式,我想将它添加到 <p>

以下代码会执行此操作,但它会删除字符串的第一个字母(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

将找到的字符分组。

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

() 捕获找到的阿拉伯字符。
将其添加回替换字符串。

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

preg_replace() 不是 "cut" 字符串的第一个字母。它用您作为第二个参数传递给它的字符串替换它。这就是 preg_replace() 谋生的方式;它替换了字符串片段:-)

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

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

或者您可以使用 assertion:

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

无论如何,当段落包含阿拉伯语单词时,您可能需要将 <p> 替换为 <p class="foo">。我上面建议的代码更改已经使用了这个假设。