我有一个始终遵循以下格式的字符串:
This Fee Name : * Fee Id * Fee Amount $* is required for this activity
示例:
This Fee Name : STATE TITLE FEE Fee Id 2 Fee Amount $5.50 is required for this activity
我想用PHP做的是传递字符串并获得结果
STATE TITLE FEE
2
5.50
我很确定preg_match_all
是我想要的,但无法弄清楚如何正确使用正则表达式。
答案 0 :(得分:5)
实际上,您可以使用preg_match
并使用括号捕获所需的部分(请注意,括号内的?:
表示括号仅用于分组(即可能有小数)美元金额之后的点和一个或多个数字))。 (警告:未经测试,但这应该有效。)
$str="This Fee Name : STATE TITLE FEE Fee Id 2 Fee Amount $5.50 is required for this activity";
if(preg_match('/^This Fee Name :\s+(.*)\s+Fee Id\s+(\d)\s+Fee Amount\s+(\$\d+(?:\.\d+)?)\s+is required for this activity$/',$str,$matches))
{
$fee_name=$matches[1];
$fee_id=$matches[2];
$fee_amount=$matches[3];
}
else
{
//No matches! Do something...or not. Whatever.
}
答案 1 :(得分:2)
尝试以下方法:
$a = 'This Fee Name : STATE TITLE FEE Fee Id 2 Fee Amount $5.50 is required for this activity';
$regex = '/This Fee Name : (.+) Fee Id (.+) Fee Amount \$(.+) is required for this activity/';
$matches = array();
preg_match($regex, $a, $matches);
var_dump($matches);
输出:
array(4) {
[0]=>
string(91) "This Fee Name : STATE TITLE FEE Fee Id 2 Fee Amount $5.50 is required for this activity"
[1]=>
string(15) "STATE TITLE FEE"
[2]=>
string(1) "2"
[3]=>
string(4) "5.50"
}
答案 2 :(得分:0)
在PHP.net文档中,您将看到通过使用指定参数调用函数来使用preg_match_all
:
int preg_match_all(string $ pattern,string $ subject [,array& $ matches [,int $ flags = PREG_PATTERN_ORDER [,int $ offset = 0]]])
第一个参数,即模式,是如何从下一个参数(主题)中捕获信息。
主题是您希望匹配的文本。这将是您指定的信息串......“此费用名称:......等”
第三个参数是一个新数组,您可以在其中存储结果。
但是,您希望使用正则表达式解析字符串的方式存在根本缺陷。您没有将“值”与“密钥”分开的常用分隔符。
如果我是你,在这种情况下,我会使用explode()
。
试试这个:
$string = "This Fee Name : * Fee Id * Fee Amount $* is required for this activity";
$name = explode("This Fee Name :", $string, 2);
$name = $name[1];
$id = explode("Fee Id", $string, 2);
$id = $id[1];
$amount = explode("\$", $string, 2);
$amount = explode(" ", $amount[1], 2);
$amount = $amount[0];
echo "$name";
echo "$id";
echo "$amount";
我没有测试任何这个,并且在几个月内没有使用PHP但是嘿,试一试!