preg_match()使用php中的单词边界匹配部分字符串和数字

时间:2013-10-07 20:03:03

标签: php string preg-match

我确定我忽略了一些东西,但我正在尝试使用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 。

感谢您的帮助

3 个答案:

答案 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}}的字符列表,但你想要禁止更广泛的字符集,这将非常有用。