现在我已经拥有了非常基本的正则表达式技能,只使用了几次正则表达式基本的东西。这可能是之前被问过的,我为此道歉,但我找不到任何答案。发现类似,虽然并试图适应它但无济于事。 好的,问题是 - 如何仅在某些字符之间替换空格(在这种情况下为双引号)?
说我有以下字符串:
“任务播客”modcast A B C“D E F”
我想替换任务和播客之间的空格以及 D , E 之间的空格&安培; F ,而其他的则没有动过。
P.S。如果空间是一个字符串怎么办?一个例子也是受欢迎的。
编辑这一点我希望现在更清楚了。 编辑2:我需要在php中的字符串上执行此操作并在shell中执行它。 编辑3:对不起,我改变了整个问题3次,这只是我自己变得很困惑。干杯!
答案 0 :(得分:2)
我会首先将字符串拆分为带引号或不带引号的字符串组来解决此问题。
然后迭代匹配,如果填充了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脚本只会替换引用字符串中的空格。
<强>代码强>
<?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"
答案 1 :(得分: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";
?>
答案 2 :(得分:0)
根本不需要整个foreach!为此可以使用单线。
以下是替换带引号字符串中的空格的代码。这个想法是,如果一个空格在引号内,则后面跟着奇数个引号。它可以通过regexp预先完成。
echo preg_replace('{\s+(?!([^"]*"[^"]*")*[^"]*$)}',"x",$str);
这就是全部!这个怎么运作?它匹配所有未跟随偶数引号的字符。匹配的空格被x替换。您当然可以将其更改为任何所需的值或将其留空。