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

这个正则表达式来自Wordpress源代码(formatting.php,wpautop函数);我不确定它的作用,有人可以帮忙吗?

实际上我正在尝试将此函数移植到 Python ......如果有人已经知道现有的端口,那会好得多,因为我对正则表达式真的很不好。

4

8 回答 8

3

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

"|<p>|"

将是一个正则表达式,只是匹配

"<p>" 

在文本中。但是,我不清楚替换参数是什么

"$1<p>" 

会这样做,因为没有分组映射到 $1。看起来就像给定的那样,这只是用一个空字符串替换一个段落标记,然后是一个段落标记,实际上什么都不做。

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

于 2008-12-08T16:31:25.740 回答
2

...?

实际上,看起来这需要第一个<p>标记并将前一个正则表达式的第一个匹配项添加到它之前(因为在这个标记中没有匹配项),

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

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

于 2008-12-08T16:15:07.973 回答
2

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

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

于 2008-12-08T16:15:44.477 回答
2

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

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

"(.*)<p>"

$0将包含整个匹配项和.$1之前的部分&lt;p&gt;

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

老实说,我现在也很困惑。只是一个猜测:在给定行之前调用另一个模式匹配方法(preg_match 等),所以$1从那里“泄漏”?

于 2008-12-08T17:05:47.513 回答
0

我强烈推荐惊人的RegexBuddy

于 2008-12-08T16:34:49.510 回答
0

我相信那条线什么也没做。

对于它的价值,这是前一行,其中设置了 $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 是一个如此广泛使用的函数,这让我怀疑我自己的结论,即这条线什么也没做。所以我期待有人纠正我。

于 2008-12-08T20:39:56.723 回答
0

正则表达式仅匹配文字文本

. 选择用竖线而不是正斜杠来分隔正则表达式是非常不幸的。它不会更改代码,但会使人类更难阅读。(这也使得在正则表达式中无法使用交替运算符。)

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

因此,此代码与以下代码相同:

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

这样做什么都不做是不正确的。搜索和替换将运行,降低您的软件速度,并为 $pee 的临时副本占用内存。

于 2008-12-13T13:37:01.197 回答
-3

它从模式中替换匹配

"|<p>|" 

由字符串

"$1<p>"

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

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

对于 $1,我猜变量 $1 在 PHP 代码中,它在 preg_replace 期间被替换,所以 if $1 = "test"; 替换将替换

"<p>" 

"test<p>"

但我不确定 1 美元

于 2008-12-08T16:16:04.493 回答