我确定我忽略了一些东西,但我正在尝试使用php对字符串数组进行简单匹配。
我的数组包含漫画标题,后跟问题编号
$comics = array('blah blah #13', 'more blah #3', 'more more blah #10');
我想找到#1问题并忽略#10和#13问题。
我的代码
foreach ($comics as $child) {
$kw = "#1"
if(preg_match("/\b".preg_quote($kw)."\b/i", $child) {
do some stuff
}
else {
do other stuff
}
}
我是正常表达的新手,但是我认为\ b就像过滤掉#10,#12等字边界一样。我厌倦了一个strpos()函数,但它是错误的匹配#10 。
感谢您的帮助
答案 0 :(得分:1)
试试这个:
foreach ($comics as $child) {
$kw = "#1";
if(preg_match("/$kw$/", $child) {
//do some stuff
}
else {
//do other stuff
}
}
PS:此代码仅在您的字符串中只有1个“#”时才有效。
PS2:正则表达式中的最后一个$表示“字符串结束”,所以如果你的字符串在数字之前有更多的东西,你应该用空格替换“$”。
答案 1 :(得分:0)
您可以避免循环并使用 preg_grep
跟随regex
:
$comics = array('blah blah #13', 'more blah #1', 'more more blah #10');
print_r(preg_grep('/#1(?=\D|$)/', $comics));
<强>输出:强>
Array
(
[1] => more blah #1
)
答案 2 :(得分:0)
根据您的样本标题,问题编号是字符串的最后一部分。如果这始终是真的,您可以使用以下正则表达式:
/#1$/
示例:
if(preg_match("/#1$/", $child) {
// #1 issue!
} else {
// not the #1 issue
}
如果问题编号可以跟随您使用\b
暗示的其他文字,则可以稍微修改您当前拥有的正则表达式,说明#1
后面没有数字:
$kw = "#1[^0-9]"
if(preg_match("/\b" . $kw . "\b/i", $child) {
如果你这样做,它可以允许标准的单词字符(例如a-z
跟随#1
,但不允许其他数字,所以你将忽略#10或#153,例如)。您可以继续展开忽略列表,方法是添加任何不能跟#1
$kw = "#1[^0-9a-z.,]";
类似#1
等字符的字符。
指定一组可以跟随\b#1(?:[.;, ]|$)
的字符可能更有意义(为简洁起见,这里只是正则表达式):
#1
此正则表达式将采用任何#1
后跟一个句点,分号,逗号或空格,或行的结尾。如果你有一个可以跟随{{1}}的字符列表,但你想要禁止更广泛的字符集,这将非常有用。