2016-08-27 129 views
0

我可以使用什麼正則表達式匹配兩個或更多分隔符內部兩個分隔符並將其清除?例如:如何清除兩個外部分隔符之間的內部分隔符

1) input: %word1 %word2%% then output: %word1 word2% 
2) input: %word1 %word2% %word3%%% then output: %word1 word2 word3% 
3) input: %%word1 word2% word3% then output: %word1 word2 word3% 

等等。 或應用具有替代忽略來自兩個分隔符的子字符串,例如:

%word1 word2% text word2 

與%WORD2%替換單詞2而不將它應用於%字詞1字詞2%的具有使輸出的東西如:

%word1 word2% text %word2% 

而不是:

%word1 %word2%% text %word2% 

非常感謝。

回答

1

對於問題的第二部分:

$ cat a.php 
<?php 
    echo preg_replace('/(?<!%)(word2)(?!%)/', '%word2%', '%word2% %word1 word2% text word2'); 
?> 
$ php a.php 
%word2% %word1 word2% text %word2% 

正則表達式是這樣的:

(?<!%)(word2)(?!%) 

Regular expression visualization

Debuggex Demo

+0

我可以問你檢查我現在發佈的代碼嗎?傳遞給正則表達式的PHP變量它不起作用。再次感謝。 –

+0

這個正則表達式:(?<!%)(word2)(?!%)也匹配一個字的子字符串。我該如何解決它?例如,如果我有「單詞」和「ord」它認爲「單詞」內的「ord」有效,這是一個錯誤。 –

+0

@MarcelloImpastato也許你可以利用單詞邊界。在這裏閱讀它:http://php.net/manual/en/function.preg-match.php –

0

我不知道這是否將是有益的或沒有,但我有一個簡單的解決方案:

$string = "%%word1 word2% word3%"; 
$output = "%".str_replace("%", "", $string)."%"; 

如果你的字包含「%」在之間這是行不通的。

+0

您好,如果輸入字符串爲其他字符串的子這個解決方案行不通。而且應該只在兩個分隔符內有效,沒有明確的外部分隔符。如果輸入字符串是%word%,則不應該返回單詞。 –

+0

如果輸入字符串是%word%,它將返回%word% – aditya4447

+0

如果我有這個字符串:「%word1 word2%word3 word4 word2」替換word2%word2%我需要得到:「%word1 word2%word3 word4%word2% 「而不是:」%word1%word2 %% word3 word4%word2%「。你的解決方案返回給我:「%word1 word2 word3 word4 word2%」,所以不好,明白嗎? –

0

以從@Nehal例如i有現在這兩部分代碼:

// CODE 1 
// string return: "word1 word2 word3 word4 word2" <-- failed 
$string = "word1 word2 word3 word4 word2"; 
$array = array("word1 word2", "word2"); 
foreach ($array as $value) { 
    $string = preg_replace('/(?<!%)($value)(?!%)/', '%$value%', $string); 
} 
echo $string; 

// CODE 2 
//string2 return: "%word1 word2% word3 word4 %word2%" <-- correct 
$string0 = "word1 word2 word3 word4 word2"; 
$string1 = preg_replace('/(?<!%)(word1 word2)(?!%)/', '%word1 word2%', $string0); 
$string2 = preg_replace('/(?<!%)(word2)(?!%)/', '%word2%', $string1); 
echo $string2; 

CODE1失敗,但CODE2正常工作!因爲我可以修復CODE1?我想在正則表達式中爲變量傳遞的值是哪個問題。解決方案?再次感謝。

UPDATE: 解決更換:

$string = preg_replace('/(?<!%)($value)(?!%)/', '%$value%', $string); 

有:

$string = preg_replace('/(?<!%)('.$value.')(?!%)/', '%'.$value.'%', $string); 
相關問題