2013-07-02 3 views
3

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

Скажем у меня есть следующая строка:

"миссии подкаста" modcast ABC "DEF"

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

P.S. Что, если пространство было строкой? Примером этого является также приветствие.

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

+1

Итак, что вы пробовали? –

+0

вы можете указать другой пример, кроме 'find/vol_stor/8s8a912hj1 | grep "" mission \ | podcast "" | grep "modcast" '? по крайней мере, 2 варианта будет много помощи – Angga

+0

ну, я ничего не пробовал, так как я не знаю, как сохранить часть согласованной строки внутри и заменить только то, что находится внутри слов, которые находятся между скобками. Итак, я открыт для всех предложений: –

ответ

2

Описание

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

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

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

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

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

enter image description here

Пример

Образец текста

"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 Пример

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

Рабочий пример: 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" 
+0

Thank вы очень много для ответа и за то, что нашли время, чтобы проиллюстрировать это! И, как это было бы прекрасно, я надеялся, что смогу избежать разделения на массивы. У вас есть какие-либо предложения с ** preg_replace ** вместо? –

+0

См. обновленный ответ, который включает в себя php с регулярным выражением. –

+0

Фактически это был оператор foreach, который я пытался избежать, но в любом случае это прекрасно. Спасибо! –

0

Если вам не нужно использовать регулярные выражения, здесь итеративный версия, которая работает :

<?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"; 
?> 
+1

Да, но не повторяется более ресурсоемкий процесс, не требуется больше времени? –

+0

Просто прошел тест «голова к голове» и (против моей интуиции) реализация регулярных выражений действительно быстрее. Я делаю это с разницей между собственным кодом (расширение PCRE реализовано в C) и интерпретированным PHP-кодом. –

0

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

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

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

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

+0

это перестает работать, если у вас нет закрывающей цитаты где-нибудь, так что представьте себе строку, которая имеет несколько цитированных текстовых сегментов, и вы оставляете закрытие цитаты, она идет дурацкой – jackrabbithanna

Смежные вопросы