正则表达式帮助 - 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.  </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 开头的字符串末尾的 "也许使用组运算符?
/6a00d834.*?(")/
然后,根据您的正则表达式 API,您可以提取括号中匹配的内容。
编辑
啊,你想做字符串替换。我猜你正在使用 Perl。试试这个:
s/(6a00d834.*?)(")/\1.jpg\2/
【讨论】:
这有点多余,因为您总是会从该分组中获得双重 qoute。 是的,但我认为这就是他想要的:'然而我只想匹配最后'而不是整个目标字符串。' 所有应有的尊重,但如果你明白我的意思,OP 可能不是他真正想要什么的最佳判断者。以上是关于正则表达式帮助 - Wordpress (search-regex)的主要内容,如果未能解决你的问题,请参考以下文章
使用 .htaccess 正则表达式重定向 wordpress 结构的正确方法