我可以让它工作的唯一方法是使用:
$subject = 'My 00123450 "Ralph" ("France" is my country, "123" my age, ... , "an other text", ...)';
$pattern = '/\((?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?[^"]*?\)/';
preg_match_all($pattern, $subject, $matches);
for ($i = 1; $i < count($matches); $i++)
{
print($i.': '.$matches[$i][0].";\n");
}
输出:
1: France;
2: 123;
3: an other text;
该正则表达式仅适用于一组括号内最多出现3 次“引用字符串”。但是,您可以扩展正则表达式字符串以获取最多N 次出现,如下所示:
在每组括号中查找 1 到 N 个带引号的字符串的正则表达式是:
n=1 /\((?:[^"\)]*"(.*?)")?[^"]*?\)/
n=2 /\((?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?[^"]*?\)/
n=3 /\((?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?[^"]*?\)/
要查找 1-N 个字符串,请重复该部分(?:[^"\)]*"(.*?)")?
N 次。对于每组括号中的 1-100 个字符串,您必须重复该部分 100 次 - 显然正则表达式将开始非常缓慢地评估。
我意识到这绝不是理想的,但它是我在一次通过解决方案方面的最大努力。
在 2 次通过中:
$subject = 'My name is "Ralph" ("France" is my country, "123" my age, ... , "an other text", ...)';
$pattern = '/\(.*?\)/';
preg_match_all($pattern, $subject, $matches);
$pattern2 = '/".*?"/';
preg_match_all($pattern2, $matches[0][0], $matches2);
print_r($matches2);
在 2 遍中产生正确的输出。急切地等待一个答案,显示如何在 1 中做到这一点。我已经尝试了我能想到的所有变体,但无法让它包含重叠匹配。