我正在尝试解析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>
非常感谢你。
答案 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);