在 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,后跟一个点,然后是 gif
、png
、jpg
或 jpeg
(大小写-不敏感)。
如果您需要更多文件后缀,您可以通过添加竖线 (|
) 然后是您的后缀来使用另一个替代方案扩展表达式。
如果您需要在文件名前面包含更多可能的字符,您可以像这样创建一个字符 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',
)
您会发现,通过收紧文件后缀要求,您可以避免非图像文件的意外匹配。
发件人:
$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,后跟一个点,然后是 gif
、png
、jpg
或 jpeg
(大小写-不敏感)。
如果您需要更多文件后缀,您可以通过添加竖线 (|
) 然后是您的后缀来使用另一个替代方案扩展表达式。
如果您需要在文件名前面包含更多可能的字符,您可以像这样创建一个字符 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',
)
您会发现,通过收紧文件后缀要求,您可以避免非图像文件的意外匹配。