如何在PHP中使用正则表达式检查特定的字符串序列

r9f1avp5  于 2023-02-21  发布在  PHP
关注(0)|答案(1)|浏览(78)

我正在尝试创建一个正则表达式来从公司列表中提取公司详细信息,但遇到了困难,因为有些公司将其移动的号码列在公司代码之前,而有些公司将其移动电话号码列在公司代码之后。他们只想匹配移动电话号码列在公司代码之后的公司,并尝试在正则表达式中使用前瞻,但没有成功。
正则表达式语法
details of the company:(?<address>[^\n\r]*)\b(?!.*mobile).*(company-code:)(.*?)(mobile:)(.*?)
要检查的字符串:
公司的详细信息:名称:xyz,公司代码:100,移动的:123
公司的详细信息:姓名:xyz,移动的:12345,公司代码:100

jyztefdp

jyztefdp1#

我建议你换个Angular 来看,从更一般的Angular 来看,你的字符串有一个prefix: field1:value1, field2:value2, ...的模式,所以你可以专注于匹配字段:值对,使用preg_match_all()你可以把所有的匹配作为集合来获取。

$data = [
  'details of the company: name:xyz, company-code:100, mobile:123',
  'details of the company: name:xyz, mobile:12345, company-code:100',
];

$pattern = '((?<field>[a-z-]+):\s*(?<value>[^,:]+)(?:,|$))';

$companies = [];
foreach ($data as $subject) {
    if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
        // new company array
        $company = [];
        // iterate and add found fields
        foreach ($matches as $match) {
            $company[$match['field']] = $match['value'];
        }
        // add company array to list
        $companies[] = $company;
    } 
}

var_dump($companies);

输出:

array(2) {
  [0]=>
  array(3) {
    ["name"]=>
    string(3) "xyz"
    ["company-code"]=>
    string(3) "100"
    ["mobile"]=>
    string(3) "123"
  }
  [1]=>
  array(3) {
    ["name"]=>
    string(3) "xyz"
    ["mobile"]=>
    string(5) "12345"
    ["company-code"]=>
    string(3) "100"
  }
}

另一个解决方案是使用字符串函数。从主题中删除所有不必要的部分,然后拆分它。

$prefix = 'details of the company: ';

$companies = [];
foreach ($data as $subject) {
    $subject = substr($subject, strlen($prefix));
    $pairs = explode(',', $subject);
    $company = [];
    foreach ($pairs as $pair) {
        [$field, $value] = explode(':', $pair);
        $company[trim($field)] = trim($value);
    }
    $companies[] = $company;
}

var_dump($companies);

相关问题