Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式php在不同的组中从字符串中分离出精确的单词_Php_Regex_Word - Fatal编程技术网

正则表达式php在不同的组中从字符串中分离出精确的单词

正则表达式php在不同的组中从字符串中分离出精确的单词,php,regex,word,Php,Regex,Word,我已经尝试了我所知道的一切,但仍然不知道如何解决此问题: 我有一个字符串: “--包括--在销售价格中:5%增值税10.00美元包装费2%通知费” “--不包括在销售价格中:35.00美元快递费2%通知费” 我想知道税是“包括”还是“不包括”,费用是“%还是“货币” 问题在于,当货币“usd”附加到税号“vat usd”时,它没有检测到货币“usd” 如何将货币与不同组中的税务名称区分开来 以下是我所做的 (--excluded--|--included--|--not included--

我已经尝试了我所知道的一切,但仍然不知道如何解决此问题:

我有一个字符串:

  • “--包括--在销售价格中:5%增值税10.00美元包装费2%通知费”
  • “--不包括在销售价格中:35.00美元快递费2%通知费”
我想知道税是“包括”还是“不包括”,费用是“%还是“货币” 问题在于,当货币“usd”附加到税号“vat usd”时,它没有检测到货币“usd”

如何将货币与不同组中的税务名称区分开来

以下是我所做的

(--excluded--|--included--|--not included--)([a-z ]*)?:?(usd | aed | mad | € | us\$ )?([ \. 0-9 ]*)(%)?([a-z A-z ?]*) (aed|mad|€|us\$)*((aed|mad|€|us\$)+)?([\. 0-9 ]*)(%)?([a-z A-z]*)(.*)?
这是我得到的

(--excluded--|--included--|--not included--)([a-z ]*)?:?(usd | aed | mad | € | us\$ )?([ \. 0-9 ]*)(%)?([a-z A-z ?]*) (aed|mad|€|us\$)*((aed|mad|€|us\$)+)?([\. 0-9 ]*)(%)?([a-z A-z]*)(.*)?
匹配1
完全匹配0-83--包括在销售价格中:5%增值税10.00美元包装费2%通知费
第一组。0-12--包括在内--
第2组。销售价格中的12-29
第4组。30-33    5 
第5组。33-34   %
第6组。34-42美元增值税
第10组。43-49   10.00 
第12组。49-64包装费
第13组。64-82 2%通知费
这就是我想要的

匹配1
完全匹配0-83--包括在销售价格中:5%增值税10.00美元包装费2%通知费
第一组。0-12--包括在内--
第2组。销售价格中的12-29
第4组。30-33    5 
第5组。33-34   %
第6组。34-38增值税
第7组。38-42美元
第10组。43-49   10.00 
第12组。49-64包装费
第13组。64-82 2%通知费
以下是解决方案:

$s = "--included-- in product price: breakfast --excluded--: 5 % vat aed 10.00 destination fee per night 2 % municipality fee 3.5 % packaging fee 10 % warranty service charge";
$results = [];
if (preg_match_all('~(--(?:(?:not )?in|ex)cluded--)(?:\s+([a-zA-Z ]+))?:+\s*((?:(?!--(?:(?:not )?in|ex)cluded--).)*)~su', $s, $m, PREG_SET_ORDER, 0)) {
    foreach ($m as $v) {
        $lastline=array_pop($v); // Remove last item //print_r($details);
        if (preg_match_all('~(?:(\b(?:usd|aed|mad|usd)\b|\B€|\bus\$)\s*)?\d+(?:\.\d+)?(?:(?!(?1))\D)*~ui', $lastline, $details)) {
            $results[] = array_merge($v, $details[0]);
        } else {
            $results[] = $v;
        }
    }
}
print_r($results);

注:

第一个正则表达式提取需要解析的每个匹配项。看见这意味着:

  • (-(?:(?:不)?包括在内--
    -第1组:较短版本的
    (-排除--include--not include--not include--
    --排除--
    --包括--
    --不包括--
  • (?:\s+([a-zA-Z]+)?
    -可选序列:1+空格,然后分组2:1+ASCII字母或空格
  • :+
    -1个或多个冒号
  • \s*
    -0+空格
  • ((?:(?!-(?:(?:不)?在| ex)中包括-)*)
    -第3组:任何字符,0+次,尽可能多,不启动三个字符序列中的任何一个:
    --排除--
    --包括--
    --不包括--
然后,需要进一步解析group3值以获取所有细节。在这里是用来匹配的

  • (?:(\b(?:usd | aed | mad | usd)\b | \b€| \bus\$)\s*)?
    -可选的
    • (\b(?:usd | aed | mad | usd)\b | \b€| \bus\$)
      -第1组:
      • \b(?:usd | aed | mad | usd)\b
        -
        usd
        aed
        mad
        usd
        作为整句话
      • \B€
        -
        前面没有字符
      • \bus\$
        -
        us$
        前面没有字符
    • \s*
      -0+空格
  • \d+
  • (?:\。\d+)
    -可选的
    和1+数字序列
  • (?:(?!(?1))\D)*
    -任何非数字字符,尽可能多地出现0次或更多次,与组1中的模式不同

您好,Wiktor,第一个示例有效,但这一个示例无效,例如:“--不包括--在售价中:35.00美元快递费15.00美元通知费”我得到的是:第4组。212-218 35.00组10。218-218组12。218-235快递费usd@MounirMoel什么意思?如果您需要更多帮助,请解释您需要捕获的每个部分以及原因。我发布了所有可能的提示,如果您希望自己保留要求,请进一步微调正则表达式。是的,我只需要在一个组中捕获金额,在另一个组中捕获货币,当我执行您提供给我的解决方案时,它在一个组中捕获“快递费usd”,我需要两个单独的组一个来捕获“快递费”和另一个抓取“美元”的方法我希望你现在明白了:)@MounirMoel所以,这意味着,你需要在最后一个抓取组之前添加另一个抓取组,对吗?试试看。如果这是你需要的,我会再做一点,因为它现在有点不精确。