Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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_Substring_Quotes_Double Quotes - Fatal编程技术网

替换php正则表达式中引号之间的部分字符串

替换php正则表达式中引号之间的部分字符串,php,regex,substring,quotes,double-quotes,Php,Regex,Substring,Quotes,Double Quotes,现在我已经有了非常基本的正则表达式技能,只在基本的东西上使用过几次正则表达式。这个问题以前可能有人问过,对此我深表歉意,但我找不到任何答案。尽管发现了类似的情况,并试图对其进行调整,但无济于事。 好的,对于这个问题-如何仅替换某些字符之间的空格(在本例中为双引号) 假设我有以下字符串: “任务播客”modcast A B C D E F 我想替换任务和播客之间的空格,以及D、E和F之间的空格,同时保持其他空格不变 顺便问一下,如果空格是字符串呢?这方面的一个例子也是值得欢迎的 编辑了一点,我希望

现在我已经有了非常基本的正则表达式技能,只在基本的东西上使用过几次正则表达式。这个问题以前可能有人问过,对此我深表歉意,但我找不到任何答案。尽管发现了类似的情况,并试图对其进行调整,但无济于事。 好的,对于这个问题-如何仅替换某些字符之间的空格(在本例中为双引号)

假设我有以下字符串:

“任务播客”modcast A B C D E F

我想替换任务播客之间的空格,以及DEF之间的空格,同时保持其他空格不变

顺便问一下,如果空格是字符串呢?这方面的一个例子也是值得欢迎的

编辑了一点,我希望现在它更清楚了。 编辑2:我需要在php中的字符串上执行此操作,并在shell中执行它。 编辑3:对不起,我把整个问题改了三次,只是我自己也很困惑。干杯

描述 我将首先将字符串分为带引号或不带引号的字符串组来解决这个问题

然后遍历匹配项,如果填充了捕获组1,则会引用该字符串,因此只需对替换捕获组0进行简单替换即可。如果未填充捕获组1,则跳到下一个匹配

在每次迭代中,您只需要构建一个新字符串

由于拆分字符串是困难的部分,我将使用以下正则表达式:

(“[^”]*”)|[^”]*

例子 示例文本

"mission podcast" modcast A B C "D E F"
<?php
    function remove_quoted_whitespace($str) {
        $result = '';
        $length = strlen($str);
        $index = 0;
        $in_quotes = false;

        while ($index < $length) {
            $c = $str[$index++];

            if ($c == '"') {
                $in_quotes = !$in_quotes;
            } else if ($c == ' ') {
                if ($in_quotes) {
                    continue;
                }
            }

            $result .= $c;
        }

        return $result;
    }

    $input = '"mission podcast" modcast A B C "D E F"';
    $output = remove_quoted_whitespace($input);

    echo $input . "\n";
    echo $output . "\n";
?>
代码

PHP Code Example: 
<?php
$sourcestring="your source string";
preg_match_all('/("[^"]*")|[^"]*/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
"mission~~new~~podcast" modcast A B C "D~~new~~E~~new~~F"
PHP示例 此php脚本将仅替换带引号字符串中的空格

工作示例:

代码

PHP Code Example: 
<?php
$sourcestring="your source string";
preg_match_all('/("[^"]*")|[^"]*/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
"mission~~new~~podcast" modcast A B C "D~~new~~E~~new~~F"

如果不需要使用正则表达式,下面是一个迭代版本:

echo preg_replace('{\s+(?!([^"]*"[^"]*")*[^"]*$)}',"x",$str);

完全不需要整个foreach!为此,可以使用一个衬里

下面是替换带引号字符串中空格的代码。这个想法是,如果一个空格在引号内,它后面跟着奇数个引号。这可以通过regexp look-ahead完成


就这些!它是如何工作的?它匹配所有后面没有偶数引号的\s字符。匹配的空格被x替换。当然,您可以将其更改为任何所需的值或将其保留为空。

那么您到目前为止尝试了什么?您是否可以提供除查找/vol_stor/8s8a912hj1 | grep“mission”podcast“| grep“modcast”之外的更多示例
?至少两个变体会有很大帮助。好吧,我没有尝试过任何东西,因为我不知道如何在括号中保留匹配字符串的一部分,而只替换括号中的单词。因此,我愿意接受各种建议:)用
$2$4(
替换这个正则表达式(“\w+”)(*?”),为什么PHP是其中一个标签?非常感谢您的回答,并花时间对其进行说明!由于它会做得很好,我希望我能避免分裂成数组。你对preg_replace有什么建议吗?事实上,这是我试图避免的foreach声明,但是,无论如何,这是完美的。非常感谢你!如果空格是字符串呢?我能匹配整个字符串吗?不管我怎么想。如果像我这样的noob想知道,
echo preg\u replace('/\s(?=.*)/ims',“~~new~',$entry);
中的\s应该被替换为您想要替换的字符串。非常感谢大家!您能解释一下上一个正则表达式中的
(?=.*)
部分吗?是的,但迭代不是资源密集型的,这不是需要更长的时间吗?只是运行了一个头对头测试,而且(与我的直觉相反)正则表达式的实现确实更快。我将其归因于本机代码(PCRE扩展是用C实现的)与解释的PHP代码之间的差异。如果没有右引号,这将停止工作,因此,假设一个字符串有多个带引号的文本段,而你将右引号保留,这会很奇怪