(.*?) 和: auto">(.*?)\s 我试过添加几个修饰符,例如 -6ren">
gpt4 book ai didi

php - 获取多行的所有 URL

转载 作者:搜寻专家 更新时间:2023-10-31 21:08:09 25 4
gpt4 key购买 nike

我试图从一个网站获取所有这些 URL,但我似乎只能获取第一个 URL。如何匹配所有网址?

到目前为止我已经尝试过

auto">(.*?)<\/pre>

和:

auto">(.*?)\s<\/pre>

我试过添加几个修饰符,例如 mi,但似乎没有帮助。

这就是我要搜索的内容:

auto">http://url-one.com
http://url-two.com
http://url-three.com
http://url-four.com
http://url-five.com</pre>

有人可以帮助我了解我所缺少的吗?

最佳答案

快速回答

正如 Jonny5 在他的评论中暗示的那样,.默认不匹配换行符:so (.*?)如果没有 s,将不会匹配第一行以外的内容正则表达式修饰符,然后他的建议就是快速回答:

/auto">(.*?)<\/pre>/s

你可以看看他的Regex101 demo或相关的 PHP 代码...

$re = "/auto\">(.*?)<\\/pre>/s"; 
$str = "auto\">http://url-one.com\nhttp://url-two.com\nhttp://url-three.com\nhttp://url-four.com\nhttp://url-five.com</pre>";

preg_match($re, $str, $matches);

...供引用。

深入挖掘

但是,这里还有一些事情要做。

i 和 m 修饰符

首先,无论您是否使用im修饰符,示例文本中没有一行与 auto"> 匹配在开头 <\/pre>在模式的末尾。您必须分组并在每个量词后跟一个量词以使其成为可选的(例如 (?:auto">)?(?:<\/pre>)? )以匹配示例文本的每一行。

m 需要全局匹配

其次m修饰符将需要全局匹配——并进一步调整模式以避免最后一个 URL 匹配以 </pre> 结尾:

/(?:auto">)?(.+)(?=(?:\n|<\/pre>))/m

您还可以查看 second Regex101 demo这种扭曲或在 PHP 中尝试:

$re = "/(?:auto\">)?(.+)(?=(?:\\n|<\\/pre>))/m"; 
$str = "auto\">http://url-one.com\nhttp://url-two.com\nhttp://url-three.com\nhttp://url-four.com\nhttp://url-five.com</pre>";

preg_match_all($re, $str, $matches); // NOTE: preg_match_all to match globally
^^^^

选择哪种方法

简单添加 s 之间的选择修改器或调整模式,添加 m修饰符,而全局匹配主要取决于您是要与所有 URL 进行一次匹配(以换行符分隔)还是多次匹配,每个匹配与一个 URL。

后者产生下面的匹配...

MATCH 1
1. [6-24] `http://url-one.com`
MATCH 2
1. [25-43] `http://url-two.com`
MATCH 3
1. [44-64] `http://url-three.com`
MATCH 4
1. [65-84] `http://url-four.com`
MATCH 5
1. [85-104] `http://url-five.com`

...与原始模式和 s 的单一匹配相比修饰符产量:

MATCH 1
1. [6-104] `http://url-one.com
http://url-two.com
http://url-three.com
http://url-four.com
http://url-five.com`

关于php - 获取多行的所有 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28783481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com