在 PHP 中找到两个不同的子字符串

Find two different substr in PHP

发件人:

$str = "This is one string with this picture pic1.jpg and here there's another one pic2.png for example"

我想使用类似于 preg_match_all() 的东西,但我想只用一行。我只想在一个数组中包含:[pic1.jpg] 和 [pic2.png].

像这样:

preg_match_all(
'/picture (.*) and|one (.*) for/',
$pat,
$matches,
PREG_PATTERN_ORDER));

我知道这段代码很糟糕,但我认为你有想法。

更新回复:

<?php

$str = "This is one string with this picture pic1.jpg and here there's another one pic2.png for example";
$pat = '/\w+\d\.[a-zA-Z]{3}/';

$arrImg = null;
if (preg_match_all( $pat, $str, $matches, PREG_PATTERN_ORDER )) {
    $arrImg = array_pop($matches);
    print_r($arrImg);
}
else
{
   echo "no matches";
}

demo

即使对于经验丰富的开发人员来说,正则表达式也是一个具有挑战性的主题。因此,重要的是要了解什么是合适的正则表达式,什么是不必要的。另外,还有一个"greediness"的概念,即有时你能得到比你要求的更多的回报。在这种特殊情况下,OP 希望获得的只是两个图像的文件名。

所以,正则表达式比人们想象的要简单得多。获胜模式搜索一个或多个由“\w”表示的单词字符,然后是数字的转义序列,即“\d”,然后是句点。句点必须被转义,否则它会被解释为任何其他字符。最后,文件扩展名由三个字母字符组成,允许 "jpg" 或 "png" 的文件扩展名。

要从数组 $matches 的第一个元素中提取包含图像文件名的数组,代码使用 array_pop()。

这将匹配您想要的图像文件,文件后缀的灵活性较低(提高了准确性),文件名的灵活性更高。

模式:(Demo)/\w+\.(?:gif|png|jpe?g)/i

这将匹配一个或多个 letters/numbers/underscores,后跟一个点,然后是 gifpngjpgjpeg(大小写-不敏感)。

如果您需要更多文件后缀,您可以通过添加竖线 (|) 然后是您的后缀来使用另一个替代方案扩展表达式。

如果您需要在文件名前面包含更多可能的字符,您可以像这样创建一个字符 class [\w@!] 这也将允许 @!.或者您可以将 \w 更改为 \S 以匹配所有非白色字符,但这会稍微减慢您的模式。

PHP代码:(Demo)

$str="Match four pictures like this: pic1.jpg, pic2.png, pic3.gif, and pic4.jpeg for example, but not these: document5.pdf and excel7.xls.";
var_export(preg_match_all('/\w+\.(?:gif|png|jpe?g)/i',$str,$out)?$out[0]:'failed');

输出:

array (
  0 => 'pic1.jpg',
  1 => 'pic2.png',
  2 => 'pic3.gif',
  3 => 'pic4.jpeg',
)

您会发现,通过收紧文件后缀要求,您可以避免非图像文件的意外匹配。