我正在尝试使用正则表达式在特定单词之后检索5个单词。我的代码如下。
$str= '<li>111-37774 Blue</li><li>111-1566 Red</li><li>122-4555 White</li><li>1455-789 Yellow</li></ul>Minimum order applies. This is a string for testing.<p>';
$regexForPattern ='/((?:\w+\W\s*){0,5})minimum\b((?:\W*\w+){0,5})/i';
preg_match_all ($regexForPattern , trim( preg_replace('#<[^>]+>#', ' ', $str) ), $patternMatches);
print_r($patternMatches);
我想在$str
的“最小”一词前后加5个字。
目前我的输出为:
Array ( [0] =>
Array ( [0] => 4555 White 1455-789 Yellow Minimum order applies. This is a )
[1] => Array ( [0] => 4555 White 1455-789 Yellow )
[2] => Array ( [0] => order applies. This is a )
)
我希望结果数组中的字符串 122-4555 White 1455-789 Yellow 而不是 4555 White 1455-789 Yellow 。对于像 1455-789 这样的单词,它将 1455 视为一个单词而将 789 视为另一个单词。我怎样才能得到准确的单词?
任何人都可以帮我解决这个问题吗?提前谢谢。
答案 0 :(得分:1)
\w
在数字之间无法匹配-
,因此正则表达式无法从预期位置获取预期的子字符串。
您应该将(?:\w+\W\s*){0,5}
替换为(?:\S+\s+){0,5}
,将(?:\W*\w+){0,5}
替换为(?:\s+\S+){0,5}
:
'~((?:\S+\s+){0,5})minimum\b((?:\s+\S+){0,5})~'
请参阅regex demo。
这样,您将匹配关键字前后的任意0到5个以空格分隔的非空白块。
请参阅PHP demo:
$str= '<li>111-37774 Blue</li><li>111-1566 Red</li><li>122-4555 White</li><li>1455-789 Yellow</li></ul>Minimum order applies. This is a string for testing.<p>';
$regexForPattern ='/((?:\S+\s+){0,5})minimum\b((?:\s+\S+){0,5})/i';
$nstr = trim( preg_replace('#<[^>]+>#', ' ', $str));
echo $nstr . "\n";
preg_match_all ($regexForPattern , $nstr, $patternMatches);
print_r($patternMatches);