首页 > 解决方案 > 使用正则表达式检测带引号的引号

问题描述

我正在寻找一种方法来检测和删除引号中的引号,例如:某事“某事”某“某事”某事。

如您所见,在上面的示例中,斜体的东西用双引号括起来。我想从这些外引号中去掉里面的字符串。

因此,表达式应该简单地查找引号之间的文本加上另一组文本换行文本,然后删除最后一个换行的引号。

这是我当前的代码(php):

    preg_match_all('/".*(".*").*"/', $text, $matches);
    if(is_array($matches[0])){
        foreach($matches[0] as $match){
            $text = str_replace($match, '"' . str_replace('"', '', $match) . '"', $text);
        }
    }

标签: phpregex

解决方案


如果字符串以 a 开头"并且字符串内的双引号始终是平衡的,您可以使用:

^"(*SKIP)(*F)|"([^"]*)"

这将匹配字符串开头的双引号,然后使用SKIP FAIL跳过该匹配项。然后它会 match ",在一个组中捕获介于 the"和 match a之间的内容"

在替换中,您可以使用捕获组 1$1

$pattern = '/^"(*SKIP)(*F)|"([^"]+)"/';
$str = "\"something \"something something\" and then \"something\" something\"";
echo preg_replace($pattern, "$1", $str); 

“某事某事某事然后某事某事”

演示


推荐阅读