$pee = preg_replace( '|<p>|', "$1<p>", $pee );
这个正则表达式来自Wordpress源代码(formatting.php,wpautop函数);我不知道它做了什么,有人可以帮忙吗?
实际上我正试图将这个函数移植到Python ......如果有人知道现有的端口,那就好了,因为我对正则表达式真的很糟糕。
答案 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
包含<p>
之前的部分。
由于给定的reg-ex没有声明任何组,并且$1
不是其他地方定义的变量(在PHP4中)的有效名称,因此此调用似乎用{替换<p>
的任何出现{1}}?
说实话,现在我也很困惑。只是一个猜测:获取另一个在给定行之前调用的模式匹配方法(preg_match之类),以便<p>
从那里“泄露”?
答案 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