$pee = preg_replace( '|<p>|', "$1<p>", $pee );
这个正则表达式来自Wordpress源代码(formatting.php,wpautop函数);我不确定它的作用,有人可以帮忙吗?
实际上我正在尝试将此函数移植到 Python ......如果有人已经知道现有的端口,那会好得多,因为我对正则表达式真的很不好。
preg_replace() 函数 - 有点令人困惑 - 允许您使用除标准“/”之外的其他分隔符用于正则表达式,所以
"|<p>|"
将是一个正则表达式,只是匹配
"<p>"
在文本中。但是,我不清楚替换参数是什么
"$1<p>"
会这样做,因为没有分组映射到 $1。看起来就像给定的那样,这只是用一个空字符串替换一个段落标记,然后是一个段落标记,实际上什么都不做。
任何对 PHP 怪癖有更深入了解的人都有更好的分析?
...?
实际上,看起来这需要第一个<p>
标记并将前一个正则表达式的第一个匹配项添加到它之前(因为在这个标记中没有匹配项),
但是,至少可以说这种行为是不好的,因为不能保证 preg_* 函数不会用自己的值破坏 $1 。
编辑:从杰伊的评论来看,这个正则表达式实际上什么也没做。
wordpress 真的称变量为“小便”吗?
我不确定 $1 代表什么(第一个参数中没有大括号?),所以我认为它实际上没有任何作用,但我可能是错的。
在这种情况下,管道符号|
没有“匹配这个或那个”的默认含义,而是用作模式的替代分隔符,而不是更常见的斜杠/
。这可能是有道理的,如果您想匹配 for/
而不必逃避这些外观(例如/(.\*)\/(.\*)\//
,不如 可读#/(.\*)/(.\*)/#
)。不过,使用它似乎是相当有效的,|
但这只是模式的另一个保留字符。
通常$1
在替换模式中应该匹配由括号表示的第一组。例如,如果你有一个像
"(.*)<p>"
$0
将包含整个匹配项和.$1
之前的部分<p>
。
由于给定的 reg-ex 没有声明任何组并且$1
不是在别处定义的变量(在 PHP4 中)的有效名称,因此此调用似乎替换了任何出现的<p>
with <p>
?
老实说,我现在也很困惑。只是一个猜测:在给定行之前调用另一个模式匹配方法(preg_match 等),所以$1
从那里“泄漏”?
我强烈推荐惊人的RegexBuddy
我相信那条线什么也没做。
对于它的价值,这是前一行,其中设置了 $1:
$pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee);
但是,我认为这不值得。在我的测试中,$1 不会保持从一个 preg_replace 到下一个的值,即使下一个没有为 $1 设置自己的值。请记住,PHP 变量名不能以数字开头(参见: http: //php.net/language.variables),因此 $1 不是 PHP 变量。它仅表示单个 preg_replace 中的某些内容,在这种情况下 preg_replace 的规则表明它没有任何意义。
也就是说,autop 是一个如此广泛使用的函数,这让我怀疑我自己的结论,即这条线什么也没做。所以我期待有人纠正我。
正则表达式仅匹配文字文本
. 选择用竖线而不是正斜杠来分隔正则表达式是非常不幸的。它不会更改代码,但会使人类更难阅读。(这也使得在正则表达式中无法使用交替运算符。)
$1 在 PHP 中不是一个有效的变量名,因此 $1 永远不会插入双引号字符串中。$1 不变地传递给 preg_replace。preg_replace 解析替换字符串,并将 $1 替换为第一个捕获组的内容。如果没有捕获组,则 $1 将被替换为空。
因此,此代码与以下代码相同:
$pee = preg_replace( '/<p>/', "<p>", $pee );
这样做什么都不做是不正确的。搜索和替换将运行,降低您的软件速度,并为 $pee 的临时副本占用内存。
它从模式中替换匹配
"|<p>|"
由字符串
"$1<p>"
该| 在替换模式中是导致正则表达式引擎匹配左侧的部分或右侧的部分。
我不明白为什么要这样使用它,因为通常它是用于“ta(b | p)e”之类的......
对于 $1,我猜变量 $1 在 PHP 代码中,它在 preg_replace 期间被替换,所以 if $1 = "test"; 替换将替换
"<p>"
到
"test<p>"
但我不确定 1 美元