1

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

谢谢你的帮助

4

3 回答 3

1

尝试这个:

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

PS:此代码仅在您的字符串中只有 1 个“#”时才有效。

PS2:正则表达式中的最后一个 $ 表示“字符串结尾”,因此如果您的字符串在数字之前有更多内容,则应将“$”替换为空格。

于 2013-10-07T20:07:07.240 回答
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
)
于 2013-10-07T20:16:16.070 回答
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如果您确实有一个可以跟随的字符列表但您想禁止更广泛的字符集,这将很有用。

于 2013-10-07T20:19:04.223 回答