PHP中的可选子字符串与正则表达式

时间:2014-01-23 15:42:44

标签: php regex string

我正在尝试解析PHP中的字符串并将子字符串存储到数组中。字符串的格式如下:

@SomeText1 ;SomeText2 $SomeText3 #SomeText4

(“SomeText”子串永远不会包含@; $#字符,所以这不是一个问题)

我想使用PHP分别提取SomeText1,SomeText2,...但是有一个问题。一切都来自“;”是可选的。所以一些示例字符串可能是:

@ SomeText1 ; SomeText2 
@ SomeText1 # SomeText4
@ SomeText1 $ SomeText3 # SomeText4

我完全不知道如何做到这一点。

我已经尝试在这里搜索这个答案,但我能找到的最接近的是(Matching an optional substring in a regex)和(Regex to capture an optional group in the middle of a block of input),但是在尝试将其应用到我的案例时我失败了。 / p>

非常感谢你。

3 个答案:

答案 0 :(得分:0)

您可以在preg_match函数调用中使用此正则表达式:

'/@ *(\w+)(?: *; *(\w+))?/'

为你的2个字符串(匹配组)寻找matches[1] and matches[2]

答案 1 :(得分:0)

只要订单一致,您就可以这样做:

preg_match("((@\S+)\s*(;\S+)?\s*(\$\S+)?\s*(#\S+)?)",$input,$matches);

现在,$matches是:

$matches = array(
    "@SomeText1",
    ";SomeText2" or null if it wasn't there,
    "$SomeText3" or null if it wasn't there,
    "#SomeText4" or null if it wasn't there
);

HTH

答案 2 :(得分:0)

一种方法是使用preg_split

$array = preg_split('/\s*[;$#]\s*/', $text);

您还可以在其中添加@,如果要删除它,请忽略第一个元素:

$array = preg_split('/\s*[@;$#]\s*/', $text);
array_shift($array);