4

我第一次尝试使用 RE 让我卡住了。我正在通过Search-Regex 插件在 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 alt="MOvalleyConf500" 
        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 实现。)

4

5 回答 5

4

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

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

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

对于wordpress 正则表达式插件,使用 /(6a00d834.*?)(")/ 作为匹配字符串,然后使用 \1.jpg\2 作为替换字符串。

于 2009-08-01T14:16:26.950 回答
2

这不行吗?

/(6a00d834.*?)"/

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

/6a00d834.*?(")/

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

'\\1.jpg"'

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

于 2009-08-01T13:38:26.110 回答
1

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

/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 中的非贪婪说明符。

于 2009-08-01T13:43:59.570 回答
0

也许使用组运算符?

/6a00d834.*?(")/

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

编辑

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

s/(6a00d834.*?)(")/\1.jpg\2/
于 2009-08-01T13:36:21.200 回答
0

我假设您要6a00d834在第一个以下内容之后提取所有内容"。所以试试这个:

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

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

于 2009-08-01T13:46:58.070 回答