2013-10-07 24 views
1

数字部分字符串我敢肯定,我俯瞰的东西,但我想要做的使用PHP的字符串数组一个简单的比赛。的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 
} 
} 

我在常规expresions一个新手,但我sutre的\ b是像字boundries,将筛选出的#10,#12等我累strpos ()函数,但它与#10错误匹配。

感谢所有帮助

回答

1

试试这个:

foreach ($comics as $child) { 
    $kw = "#1"; 
    if(preg_match("/$kw$/", $child) { 
     //do some stuff 
    } 
    else { 
     //do other stuff 
    } 
} 

PS:如果你在你的字符串只有1个 “#” 这样的代码才有效。

PS2:在正则表达式的最后$表示“字符串的结束”,所以如果你的字符串有更多的东西在号码前应更换“$”与空间。

0

可以避免循环和使用preg_grep具有以下regex

$comics = array('blah blah #13', 'more blah #1', 'more more blah #10'); 
print_r(preg_grep('/#1(?=\D|$)/', $comics)); 

OUTPUT:

Array 
(
    [1] => more blah #1 
) 
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) { 

如果你这样做,它可以允许标准字-CHA racters(如a-z跟随#1,而不是另一个号码,以便你会忽略#10或#153,例如)。您可以通过添加任何不能跟随#1的字符来继续扩展忽略列表,类似于$kw = "#1[^0-9a-z.,]";等。

可能更感兴趣指定的字符集可以按照#1以及(就在正则表达式在这里,为了简洁):

\b#1(?:[.;, ]|$) 

此正则表达式将采取任何#1其次以句号,分号,逗号或空格,结束该行。如果您确实有一个可以遵循#1的字符列表,但您想要禁止更广泛的字符集,这将非常有用。

+0

是的,我没有提到问题编号可以跟随其他文本。谢谢你的解决方案,我会给他们一个尝试。 – kev0153