这个正则表达式做了什么

时间:2008-12-08 16:08:44

标签: php regex wordpress

$pee = preg_replace( '|<p>|', "$1<p>", $pee );

这个正则表达式来自Wordpress源代码(formatting.php,wpautop函数);我不知道它做了什么,有人可以帮忙吗?

实际上我正试图将这个函数移植到Python ......如果有人知道现有的端口,那就好了,因为我对正则表达式真的很糟糕。

9 个答案:

答案 0 :(得分:3)

wordpress真的称为变量“小便”?

我不确定$ 1代表什么(第一个参数中没有括号?),所以我认为它实际上没有做任何事情,但我可能错了。

答案 1 :(得分:3)

preg_replace()函数 - 有点令人困惑 - 允许你使用除标准“/”之外的其他分隔符来表示正则表达式,所以

"|<p>|"

将是匹配

的正则表达式
"<p>" 

在文中。但是,我不清楚

的替换参数是什么
"$1<p>" 

将会这样做,因为没有分组要映射到$ 1。这似乎是给定的,这只是用一个空字符串后跟段落标记替换段落标记,实际上什么都不做。

对PHP怪癖有更深入了解的人有更好的分析吗?

答案 2 :(得分:2)

...

实际上,它看起来像是第一个<p>标记,并在前一个正则表达式的第一个匹配前面加上它(因为在这个标记中没有匹配),

但是,似乎这种行为至少可以说是坏事,因为不能保证preg_ *函数不会用自己的值来破坏$ 1。

编辑:从周杰伦的评论来看,这个正则表达式实际上什么也没做。

答案 3 :(得分:2)

在这种情况下,管道符号|不具有“匹配此或那个”的默认含义,而是用作模式的替代分隔符,而不是更常见的斜杠/。这可能是有意义的,如果您想匹配/而不必逃避这些外观(例如/(.\*)\/(.\*)\//不像#/(.\*)/(.\*)/#那样可读)。使用|代替它只是另一种效果,但这只是模式的另一个保留字符。

通常,替换模式中的$1应与括号表示的第一组匹配。例如,如果你有像

这样的模式
"(.*)<p>"

$0将包含整个匹配,并$1包含&lt;p&gt;之前的部分。

由于给定的reg-ex没有声明任何组,并且$1不是其他地方定义的变量(在PHP4中)的有效名称,因此此调用似乎用{替换&lt;p&gt;的任何出现{1}}?

说实话,现在我也很困惑。只是一个猜测:获取另一个在给定行之前调用的模式匹配方法(preg_match之类),以便&lt;p&gt;从那里“泄露”?

答案 4 :(得分:0)

我强烈推荐令人惊叹的RegexBuddy

答案 5 :(得分:0)

我相信这条线什么都不做。

对于它的价值,这是前一行,其中设置了$ 1:

$pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee);

但是,我认为这不值得。在我的测试中,$ 1不会保持从一个preg_replace到下一个preg_replace的值,即使下一个没有为$ 1设置自己的值。请记住,PHP变量名不能以数字开头(参见:http://php.net/language.variables),因此$ 1不是PHP变量。它只表示单个preg_replace中的内容,在这种情况下,preg_replace的规则表明它并不意味着什么。

那就是说,autop是一个如此广泛使用的功能让我怀疑我自己的结论,这条线无效。所以我期待有人纠正我。

答案 6 :(得分:0)

正则表达式只是匹配文字文本

。选择使用垂直条而不是正斜杠来分隔正则表达式是非常不幸的。它不会改变代码,但它使人类更难阅读。 (这也使得在正则表达式中使用交替运算符成为不可能。)

$ 1不是PHP中的有效变量名,因此$ 1永远不会用双引号字符串进行插值。 $ 1传递给preg_replace不变。 preg_replace解析替换字符串,并将$ 1替换为第一个捕获组的内容。如果没有捕获组,$ 1将被替换为空。

因此,此代码与:

相同
$pee = preg_replace( '/<p>/', "<p>", $pee );

这没有任何作用是不正确的。搜索和替换将运行,减慢您的软件速度,并消耗内存以便临时复制$ pee。

答案 7 :(得分:-2)

我没有很多使用RegEx的经验,我没有使用RegEx测试工具,但经过一些搜索并查看其他WordPress源代码和注释后,这段代码是否有可能删除重复的段落标记和用一组标签替换它们。

答案 8 :(得分:-3)

它替换模式中的匹配

"|<p>|" 

字符串

"$1<p>"

|在替换模式中,正则表达式引擎匹配左侧的部分或右侧的部分。

我不明白为什么它被这样使用,因为通常它是用于“ta(b | p)e”......

对于1美元,我猜变量$ 1在PHP代码中并且在preg_replace期间被替换,所以如果$ 1 =“test”;替换将取代

"<p>" 

"test<p>"

但我不确定这是否为$ 1