[英]Replace part of string between quotes in php regex
現在我已經擁有了非常基本的正則表達式技能,只使用了幾次正則表達式基本的東西。 這可能是之前被問過的,我為此道歉,但我找不到任何答案。 發現類似,雖然並試圖適應它但無濟於事。 好的,問題是 - 如何僅在某些字符之間替換空格(在這種情況下為雙引號)?
說我有以下字符串:
“任務播客”modcast ABC“DEF”
我想替換任務和播客之間的空間以及D , E和F之間的空間,同時保持其他部分不受影響。
PS如果空間是一個字符串怎么辦? 一個例子也是受歡迎的。
編輯了一下我希望現在更清楚了。 編輯2:我需要在php中的字符串上執行此操作並在shell中執行它。 編輯3:對不起,我改變了整個問題3次,這只是我自己變得很困惑。 干杯!
我會通過首先將字符串拆分為帶引號或不帶引號的字符串組來解決此問題。
然后迭代匹配,如果填充了Capture Group 1,則引用該字符串,以便在替換Capture Group 0時進行簡單替換。如果未填充Capture group 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腳本將只替換引用字符串中的空格。
工作示例: 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! 為此可以使用單線程。
這是替換帶引號的字符串中的空格的代碼。 這個想法是,如果一個空格在引號內,則后面跟着奇數個引號。 它可以通過regexp預測來完成。
echo preg_replace('{\s+(?!([^"]*"[^"]*")*[^"]*$)}',"x",$str);
就這樣! 這個怎么運作? 它匹配所有未跟隨偶數引號的字符。 匹配的空格被x替換。 您當然可以將其更改為任何所需的值或將其留空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.