【问题标题】:preg_match or operatorpreg_match 或运算符
【发布时间】:2011-05-01 04:56:44
【问题描述】:

我下面的代码产生了一个错误,未知的修改“|”...我正在尝试将它用作 OR 运算符。正确运行此代码的方法是什么?

$p = "(\w+)|(\()|(\))|(\,)";
$s =  "sum(blue,paper,green(yellow,4,toast)))";
preg_match($p,$s, $matches);
print_r($matches);

编辑

好的,我稍微改了一下...~(\w+|\(|\)|,)~

现在...问题来了:我需要将该字符串拆分成这样的数组:

array("sum","(","blue","paper","green","(" ... etc );

有人可以帮我做吗?当我运行上面的表达式时,它输出一个空数组....

谢谢

【问题讨论】:

  • $p = '~(\w+)|([(])|([)])|(,)~'; IMO 会更易读,你不需要转义逗号。
  • @Kobi:感谢您指出我的错字! :)
  • re: 编辑 - 我得到 [0] => sum [1] => sum 的输出。工作正常,除了两件事:1)您预期的数组不会将逗号显示为数组元素,因此如果您不想要它,您需要从您的模式中删除它。 2)如果你想要不止一场比赛,你应该使用 preg_match_all

标签: php regex preg-match


【解决方案1】:

您的模式缺少分隔符。

$p = "~(\w+)|(\()|(\))|(\,)~";

【讨论】:

  • 老实说,我不知道为什么人们会使用其他东西 :)
  • +1 它可以工作,但仍然不能满足我的要求。你能帮帮我吗?
【解决方案2】:

你错过了@Crayon正确提到的分隔符,这个模式也做同样的事情:

$p = '~(\w+|[(]|[)]|,)~';

至于你的(新)问题,try this

$p = '~([(),])~';
$str = 'sum(blue,paper,green(yellow,4,toast)))';
$res = preg_split($p, $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

print_r($res);

输出:

Array
(
    [0] => sum
    [1] => (
    [2] => blue
    [3] => ,
    [4] => paper
    [5] => ,
    [6] => green
    [7] => (
    [8] => yellow
    [9] => ,
    [10] => 4
    [11] => ,
    [12] => toast
    [13] => )
    [14] => )
    [15] => )
)

【讨论】:

  • 只要 OP 没有任何其他字符,拆分就是正确的 - 例如,对于 1+2,拆分返回 "1","+","2",但 OP 的代码返回 "1","2",忽略其他字符(即使是空格也会被忽略,尽管示例字符串没有这样的字符)。此外,~([(),])~ 看起来更整洁:)
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 2017-04-13
  • 2013-07-25
  • 2016-01-17
  • 2011-10-30
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多