Preg替换不使用捕获的params和<

时间:2013-12-28 17:44:26

标签: php regex preg-replace

当我添加少于"<"符号

$str = 'test';
$str = preg_replace('@(.*)@isu', '<$1', $str);
echo $str; // outputs ""

它应输出<test,但不输出任何内容。

当我不添加角色时,它可以正常工作。

$str = 'test';
$str = preg_replace('@(.*)@isu', '$1', $str);
echo $str; // outputs "test"

我试图逃避它

$str = 'test';
$str = preg_replace('@(.*)@isu', '<\\\\$1', $str);
echo $str; // outputs "<\test"

我无法在php手册中找到任何相关内容,而谷歌只是吐出无关的SO问题。

我想知道为什么这不起作用?

PHP 5.4.22

3 个答案:

答案 0 :(得分:3)

在正则表达式中使用行start and end anchors

$str = 'test';
$str = preg_replace('@^(.*)$@isu', '<$1', $str);
echo $str;

或使用.+

$str = preg_replace('@(.+)@isu', '<$1', $str);

OR与.*指定最大替换次数:

$str = preg_replace('@(.*)@isu', '<$1', $str, 1);

<强>输出:

<test

问题是使用.* preg_replace匹配并替换输入字符串两次,一次用于整个输入字符串,一次用于结束(空字符串)。

答案 1 :(得分:3)

我认为您正在检查浏览器的输出。这就是它做这种行为的原因。从控制台它完美地工作。因此,我相信当您从浏览器查看html源代码时,您将找到所有内容。

此外,您可以将<替换为&lt;

答案 2 :(得分:0)

不清楚<\\\\$1如何逃避小于(<)符号?你试过这个吗?

$str = 'test';
$str = preg_replace('@(.*)@isu', '\<$1', $str);
echo $str;

编辑由于已经发现您可以在浏览器的源代码中查看<test,因此我按如下方式调整了代码,以使输出在浏览器中可读:

$str = 'test';
$str = preg_replace('@(.*)@isu', "<$1", $str);
echo '<pre>';
echo htmlentities($str);
echo '</pre>';

但是那个输出:

<test<

正如用户anubhava所解释的那样,您可以在1的末尾添加preg_replace以仅返回第一个匹配项:

$str = preg_replace('@(.*)@isu', "<$1", $str, 1);

然后输出以下原始海报所需的内容:

<test