正则表达式帮助 - Wordpress (search-regex)

Posted

技术标签:

【中文标题】正则表达式帮助 - Wordpress (search-regex)【英文标题】:Help with Regex - Wordpress (search-regex) 【发布时间】:2010-11-16 00:57:48 【问题描述】:

我第一次尝试使用 RE 时就卡住了。我正在通过Search-Regex Plugin 在 Wordpress 网站上使用 Regex,并且需要匹配隐藏在一堆 html 代码中的特定 "。HTML 示例:

provide brand-strengthening efforts for the 10-school conference.&#0160; </p>
<p>
   <a href="http://www.learfield.com/oldblog/.a/6a00d8345233fa69e201157155a6fc970c-pi">
   <img  
        border="0" 
        class="at-xid-6a00d8345233fa69e201157155a6fc970c"
        src="http://www.learfield.com/oldblog/.a/6a00d8345233fa69e201157155a6fc970c-800wi" 
        style="border: 1px solid black; margin: 0px; width: 502px; height: 384px;"             
        title="MOvalleyConf500" />
   </a>
</p>
<p>The photo above

在上面的例子中,有三个目标

6a00d8345233fa69e201157155a6fc970c-pi"
6a00d8345233fa69e201157155a6fc970c"
6a00d8345233fa69e201157155a6fc970c-800wi"

我使用的正则表达式是/6a00d834.*?"/,它可以定位它们,但是我只想匹配结尾的",而不是整个字符串。这些是缺少文件扩展名的图像,所以我需要用 .jpg 替换结尾的“我理解表达式的替换部分,这是我遇到问题的初始匹配。

我有一堆 (221),所有目标都以 6a00d834 开头,然后是一些随机字母数字以 " 结尾

欣赏任何见解。谢谢。

从 OP 的评论中添加的编辑:实际上它是在 Wordpress 网站上使用插件 (REGEX) 来查询和替换 SQL 中的数据。我可以使用任何与 Perl 兼容的正则表达式。 (来自编辑器的注释 - 取决于插件,这很可能实际上不是使用 Perl,而是 php 的 PCRE 实现。)

【问题讨论】:

你到底想从这些数据中得到什么? 你到底想匹配和提取什么? 你想要什么语言的? Perl - 我之前的错误。实际上它是在 Wordpress 网站上使用插件 (REGEX) 来查询和替换 SQL 中的数据。我可以使用任何与 perl 兼容的正则表达式。到目前为止,每个人的帮助都返回了与我的 /6a00d834.*?"/ 相同的结果(匹配整个 6a00d8345233fa69e201157155a6fc970c" 或根本没有)。再次感谢大家的帮助。 @Phil:这是插件吗? urbangiraffe.com/plugins/search-regex 如果是这样,那就是使用PHP驱动正则表达式,所以它是PHP的PCRE而不是纯Perl。另外,你能把这些信息和插件的链接放在问题中吗? 【参考方案1】:

字符串替换可以与匹配一起完成。由于您使用的是 PHP,请使用preg_replace

$newstring = preg_replace("/(6a00d834.*?)(\")/", "\\1.jpg\\2", $oldstring)

这会将匹配分成两组,然后在它们之间插入“.jpg”。

对于wordpress regex plugin,使用 /(6a00d834.*?)(")/ 作为匹配字符串,然后使用 \1.jpg\2 作为替换字符串。

【讨论】:

做到了。谢谢迈克尔。抱歉,最初的问题太不清楚了。下次我会尝试更具体。社区:非常感谢您的帮助。你们太棒了! Michael 能够理解这一点并提供解决方案。感谢所有人,尤其是迈克尔坚持不懈!【参考方案2】:

这不行吗?

/(6a00d834.*?)"/

编辑:您在其中一个 cmets 中说您想用 .jpg" 替换 ";在这种情况下,这个正则表达式可能会起作用:

/6a00d834.*?(")/

但是,最好的办法可能是使用我提供的第一个正则表达式,并使用如下所示的替换字符串:

'\\1.jpg"'

当然,\\1 必须替换为特定正则表达式引擎用于反向引用的任何内容。

【讨论】:

@Michael:我可能嵌套不正确。现在是正确的吗? 谢谢大家,我的 /(6a00d834.*?)"/ 与 /6a00d834.*?"/ 匹配。在我发布的三个示例字符串中,我只是点击结尾“这些是缺少扩展名的图像链接,所以我想用 .jpg 替换”,希望有助于清除它。 @Phil:替换" 感觉有点倒退;尝试附加 .jpg 我发布的第一个正则表达式的第一个结果的匹配项。【参考方案3】:

你的问题并不完全清楚,但也许你的意思是:

/6a00d834[^"]*"/

(即:匹配6a00d834后跟零个或多个非“后跟”的字符)

或者,如果它在您使用的正则表达式引擎中可用,您可以使用非贪婪说明符来限制“*”元字符。请记住,有关正则表达式的任何问题都取决于您使用的引擎。例如:

$猫输入 6a00384foo“更多” $ perl -ne '/(6a00384[^"]*")/;打印 "$1\n"' 输入 6a00384foo" $ perl -ne '/(6a00384.*?")/; 打印 "$1\n"' 输入 6a00384foo" $ sed 's/\(6a00384[^"]*"\).*/\1/' 输入 6a00384foo" $ sed 's/\(6a00384.*?"\).*/\1/' 输入 6a00384foo“更多”

请注意,“?”在 sed 中不用作非贪婪说明符。

【讨论】:

Phil 使用的非贪婪正则表达式已经完成了这一点。那是'*?正则表达式的一部分。 使用 ?表示非贪婪是 perl 特定的。使用 [^"] 更通用。 有时可移植性更重要。编辑回复以澄清这一点。【参考方案4】:

我假设您想提取6a00d834 之后的所有内容,直到" 之后的第一个内容。所以试试这个:

/6a00d834([^"]*)"/

第一个分组的匹配将不是您要查找的字符串。

【讨论】:

我只想提取以 6a00d834 开头的字符串末尾的 "" 你为什么要这样做? 用 .jpg 替换“是缺少文件扩展名的图像链接 你为什么不一开始就这么说?你使用什么语言? Phil 已经在使用非贪婪匹配,所以为了更接近他的正则表达式,它将是:/6a00d834(.*?)"/【参考方案5】:

也许使用组运算符?

/6a00d834.*?(")/

然后,根据您的正则表达式 API,您可以提取括号中匹配的内容。

编辑

啊,你想做字符串替换。我猜你正在使用 Perl。试试这个:

s/(6a00d834.*?)(")/\1.jpg\2/

【讨论】:

这有点多余,因为您总是会从该分组中获得双重 qoute。 是的,但我认为这就是他想要的:'然而我只想匹配最后'而不是整个目标字符串。' 所有应有的尊重,但如果你明白我的意思,OP 可能不是他真正想要什么的最佳判断者。

以上是关于正则表达式帮助 - Wordpress (search-regex)的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式验证 wordpress 字段

使用 .htaccess 正则表达式重定向 wordpress 结构的正确方法

西尔斯信用卡以 50 开头——正则表达式失败

markdown 重定向插件WordPress dengan正则表达式

正则表达式:如何提取不完整的日期并进行转换

MySQL 上的 URL 正则表达式搜索和替换(在 WordPress 中)