正则表达式 - 如何在第一次出现字符时停止

Posted

技术标签:

【中文标题】正则表达式 - 如何在第一次出现字符时停止【英文标题】:regex- how to stop at first occurrence of a character 【发布时间】:2012-07-03 09:35:27 【问题描述】:

我正在尝试从标签中提取 src 值, 到目前为止,我似乎能够提取 src 值和字符串中最后一个引号之间的字符串

字符串:

<img  border="0"  src="http://i.bookfinder.com/about/booksellers/logo_borderless/amazon_uk.gif"   >

例如在 PHP 中:

preg_match('/src=\"(.*)\"/', $row->find('a img',0), $matches);
if($matches)
   echo $matches[0];

打印出来 src="http://i.bookfinder.com/about/booksellers/logo_borderless/amazon_uk.gif" width="89" height="31" alt=""

但我真正想要打印的是... src="http://i.bookfinder.com/about/booksellers/logo_borderless/amazon_uk.gif"

或者如果可能的话…… http://i.bookfinder.com/about/booksellers/logo_borderless/amazon_uk.gif

我应该在正则表达式中添加什么?谢谢

【问题讨论】:

在下面查看我的回答,了解您在哪里犯了错误。 【参考方案1】:

其实你们很亲近>>

Yours:        preg_match('/src=\"(.*)\"/',  $row->find('a img',0), $matches);
Correct one:  preg_match('/src=\"(.*?)\"/', $row->find('a img',0), $matches);

通过添加?,您可以请求匹配.*lazy,这意味着它将匹配任何内容,直到需要为止,直到可以匹配为止。如果没有惰性运算符,它将停在最后一个双引号 " 前面,它在 alt=" 后面。

【讨论】:

/[^"]+/ 工作得更快,因为它是贪婪的。你可以使用这个正则表达式,因为图像 url 不可能包含引号。 @Serjio - Serjio,欢迎来到 SO。我在正则表达式方面非常好,我当然同意你关于性能的看法,因为如果可能的话,应该省略惰性运算符。这里的重点是,我想通过我的回答来给 OP 上一课。如您所见,我的答案是在建议[^"]+ 之后发布的,所以我不想成为一个混蛋并在没有帮助的情况下发布相同的正则表达式。惰性操作符的解释对于 OP 来说应该很重要。 谢谢,我会记住这一点,我刚刚开始阅读正则表达式 @Ωmega 好的,对不起。我不想激怒你。但正如你所写,现在每个人都会看到惰性正则表达式和贪婪正则表达式之间的区别,并且会知道我为什么使用贪婪正则表达式。 很高兴比较这两个正则表达式,可以更轻松地找到差异。不知道懒惰的运算符,只是帮我解决了我的正则表达式。谢谢(+1) :)【参考方案2】:

对于正则表达式:

preg_match('/src="([^"]+)"/', $row->find('a img',0), $matches);
echo $matches[1];

如果我是对的,您正在使用 simple_html_dom_parser 库。如果是这样,您只需输入:

$row->find('a img',0)->src

【讨论】:

+1 $row-&gt;find('a img',0)-&gt;src,我希望这是可能的。【参考方案3】:

试试吧,应该对你的需求有好处

/src=\"[^\"]+\"/

【讨论】:

以上是关于正则表达式 - 如何在第一次出现字符时停止的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 最小匹配(第一次出现) 2020-10-01

第一次出现的字符分号或空格或单引号的正则表达式[关闭]

Lua 正则表达式

如何替换 Python 中第一次出现的正则表达式?

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

如何添加空格和标点符号以使用正则表达式捕获第一组?如何在 LibreOffice 中停止某些选项卡分为两列?