gpt4 book ai didi

php - preg_match 显示 foreach 循环中的第一个匹配项

转载 作者:行者123 更新时间:2023-12-04 15:32:29 24 4
gpt4 key购买 nike

我有一组模式:

$patterns= array(
'#http://(www\.)?domain-1.com/.*#i',
'#http://(www\.)?domain-2.com/.*#i',
...
);

我有一个包含多个文本和 url 的长字符串,我想匹配字符串中出现的第一个 url,我只试过这个:

foreach ($patterns as $pattern) {
preg_match($pattern, $the_string, $match);
echo '<pre>'; print_r($match); echo '</pre>';
}

它返回空数组,其中没有匹配某些模式和包含 url 的数组,但取决于数组 $patterns 的顺序,

我怎样才能找到最先出现的这些模式的任何匹配项。

最佳答案

你基本上有三个选择:

  1. 匹配general URL pattern然后根据您获得的模式运行该 URL。如果没有匹配,则继续使用一般模式的第二个结果。
  2. 使用 PREG_OFFSET_CAPTURE 标志运行所有模式以获得模式匹配的偏移量。找到最低的偏移量,返回你的结果
  3. 将您的各种模式组合成一个模式。请注意,模式的长度有限制 ( 64K in compiled form )

选项 2:

<?php

$text = "hello world http://www.domain-2.com/foo comes before http://www.domain-1.com/bar";
$patterns= array(
'#http://(www\.)?domain-1.com/[^\s]*#i',
'#http://(www\.)?domain-2.com/[^\s]*#i',
);

$match = null;
$offset = null;
foreach ($patterns as $pattern) {
if (preg_match($pattern, $text, $matches, PREG_OFFSET_CAPTURE)) {
if ($matches[0][1] < $offset || $offset === null) {
$offset = $matches[0][1];
$match = $matches[0][0];
}
}
}

var_dump($match);

请注意,我更改了您的演示模式。我用 [^\s]* (除了空格以外的所有内容)替换了 .* (任何内容),以防止模式匹配的次数超出预期

关于php - preg_match 显示 foreach 循环中的第一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11207482/

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