Заменить часть строки между кавычками в PHP regex



Теперь у меня есть очень базовые навыки регулярного выражения, только пару раз использовал регулярное выражение для базовых вещей. Об этом, вероятно, уже спрашивали раньше, за что я прошу прощения, но я не мог найти никакого ответа на этот вопрос. Нашел похожее, хоть и пытался его адаптировать, но безрезультатно.
Хорошо, к вопросу-как я могу заменить пробел только между определенными символами (в данном случае двойными)?



Допустим, у меня есть следующая строка:




"mission podcast" modcast A B C "D E F"




Я хочу замените пробелы между mission и podcast, а также между D, е & F , оставляя другие нетронутыми.



P. S. А что если пространство строку? Пример для этого также приветствуется.



Отредактировал это немного, я надеюсь, теперь это более ясно.
Edit 2: мне нужно сделать это на строке в php и выполнить ее в оболочке.
Edit 3: Мне жаль, что я изменил весь вопрос 3 раза, просто я сам немного запутался. Ура!

1199   3  

3 ответов:

Описание

Я бы атаковал эту проблему, сначала разбив строку на группы либо в кавычках, либо без кавычек.

Затем перебираем совпадения, и если группа захвата 1 заполнена, то эта строка заключена в кавычки, поэтому просто сделайте простую замену на replace Capture Group 0. Если группа захвата 1 не заполнена, то переходите к следующему матчу.

На каждой итерации вам нужно просто создать новую строку.

Так как расщепление строки является трудная часть, я бы использовал это регулярное выражение:

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

Введите описание изображения здесь

Пример

Пример Текста

"mission podcast" modcast A B C "D E F"

Код

PHP Code Example: 
<?php
$sourcestring="your source string";
preg_match_all('/("[^"]*")|[^"]*/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

Группы Захвата

$matches Array:
(
    [0] => Array
        (
            [0] => "mission podcast"
            [1] =>  modcast A B C 
            [2] => "D E F"
            [3] => 
        )

    [1] => Array
        (
            [0] => "mission podcast"
            [1] => 
            [2] => "D E F"
            [3] => 
        )

)

Пример PHP

Этот php-скрипт заменит только пробелы внутри строк в кавычках.

Рабочий пример: http://ideone.com/jBytL3

Код

<?php

$text ='"mission podcast" modcast A B C "D E F"';

preg_match_all('/("[^"]*")|[^"]*/',$text,$matches);

foreach($matches[0] as $entry){
    echo preg_replace('/\s(?=.*?")/ims','~~new~~',$entry);
    }

Вывод

"mission~~new~~podcast" modcast A B C "D~~new~~E~~new~~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";
?>

Весь foreach вообще не нужен! Для этого можно использовать один вкладыш.

Вот код, который заменяет пробелы в строках в кавычках. Идея заключается в том, что если пробел находится внутри кавычек, то за ним следует нечетное число кавычек. Это можно сделать с помощью регулярного выражения look-ahead.

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

Вот и все! Как это работает? Он соответствует всем символам, за которыми не следует четное число кавычек. Соответствующие пробелы заменяются на x. вы, конечно, можете изменить его на любое желаемое значение или оставьте его пустым.

Comments

    Ничего не найдено.