2011-04-21 69 views
1

這是我的第一個問題在這裏。我需要做我認爲是一個簡單的php preg_replace()替換,但我不知道正則表達式。簡單的PHP preg_replace

我有一個html格式的文本字符串,打破了幾個" + figure("br") + "(包括開始和結束的引號)。我需要將它們改爲<em class="br"></em>,其中「br」是我必須保留的論點。

我有大約200多個文本要替換。當然,我可以分別替換前後文件,但希望以正確的方式進行。 提前致謝,原諒我的英語。

樣品輸入: <p>Bien!</p> <p>Gana <b>Material</b> por el <b>Doble Ataque</b> al " + figure("bn") + "c6 y a la " + figure("br") + "h8.</p>

輸出示例:<p>Bien!</p><p>Gana <b>Material</b> por el <b>Doble Ataque</b> al <em class="bn"></em>c6 y a la <em class="br"></em>h8.</p>

[編輯爲包括實際數據]

+0

請給出一個真正的示例字符串和預期輸出。 – mario 2011-04-21 22:20:17

+0

@mario真實信息添加 – morgar 2011-04-21 22:37:01

回答

1

如果你有一個可變的前置和後置字符串(或一個與元字符如你的情況),那麼我認爲這是最好使用一些正則表達式逃逸有:

// " + figure("br") + " 
$pre = '" + figure'; 
$post = ' + "'; 

// escape 
$pre = preg_quote($pre, "#"); 
$post = preg_quote($post, "#"); 

// then the regex becomes easy 
$string = preg_replace(
       "#$pre\(\"(\w+)\"\)$post#", 
       '<em class="$1"></em>', 
       $string 
); 

我假設你把一些源代碼?

+0

是的,我正在將一些舊代碼轉換爲新的更簡單的格式。我現在添加了一個示例輸入和輸出。 – morgar 2011-04-21 22:51:11

+0

在這個例子中它應該工作。 – mario 2011-04-21 22:53:53

+0

它的工作原理!不知道爲什麼,我應該學習一點正則表達式:)我正在轉換一些需要顯示文本內部棋子的國際象棋課程。在舊的方式中,該功能插入了具有所有細節的標籤。用一些CSS可以做得更容易。非常感謝您的幫助 – morgar 2011-04-21 23:06:20

2

我認爲,我們需要您提供的情況多一點信息給你一些有用的東西。做你所描述的最簡單的方法是做類似的事情:

$output = preg_replace('/.*\("br"\).*/', '<span class="br"></span>', $input); 

但我不知道這是你真正想要的。這將刪除您的初始字符串中的所有文本,並將其替換爲<span class="br"></span>塊,因此您只需重複字符串<span class="br"></span>即可。

在我聽起來像你想要的可能是將塊看起來像foo("bar")baz塊像foo<span class="bar"></span>baz塊。如果是這樣的話,你可能會想是這樣的:

$output = preg_replace('/\("(.*?)"\).*/', '<span class="$1"></span>', $input); 

然而,這只是我在我讀你的問題的方式最好的猜測。爲了真正解決這個問題,我們需要更多地瞭解,post_stringbr應該代表什麼,以及它們可能如何變化。一些示例輸入和輸出文本可能會有所幫助,可能會提供一些有關您使用此功能的信息。

編輯:我認爲你最近的編輯更清楚一點。它看起來像你試圖用正則表達式來解析JavaScript或其他編程語言,由於limitations of regex,你通常不能完美地完成。但是,以下在大多數情況下工作:

$pattern = '/(["\'])\s*\+\s*\w+\((["\'])(.*?)\2\)\s*\+\s*\1/' 
$output = preg_replace($pattern, '<span class="$3"></span>', $input); 

說明:

/ 
(["\']) #Either " or '. This is captured in backreference 1 so that it can be matched later. 
    \s*\+\s* #A literal + symbol surrounded by any amount of whitespace. 
    \w+  #At least one word character (alphanumeric or _). This is "figure" in your example. 
    \(  #A literal (character. 
    (["\']) #Either " or '. This is captured in backreference 2. 
    (.*?) #Any number of characters, but the `?` makes it lazy so it won't match all the way to the last `") + "` in the document. 
    \2  #Backreference 2. This matches the " or ' from earlier. I didn't use ["\'] again because I didn't want something like 'blah" to match. 
    \)  #A literal) character. 
    \s*\+\s* #A literal + symbol surrounded by any amount of whitespace. 
\1   #Backreference 1, to match the first " or ' quote in the string. 
/

希望這是比較容易理解的。可能很難解釋什麼正則表達式模式正在做,所以我很抱歉,如果這仍然是困難的。如果您仍然感到困惑,請參閱backreferenceslazy quantifiers的更多信息。

我不確定反向引用語法;這些天我通常不用PHP編寫代碼。如果有人想糾正我,我會很歡迎。

+0

我編輯了包含更詳細信息的問題。感謝您的回答。 – morgar 2011-04-21 22:36:12

+0

我添加了一個示例輸入和輸出。不知道你在哪裏搜索(如果你這樣做)在正則表達式中的「figure()」 – morgar 2011-04-21 22:53:54

+0

@morgar - 我知道缺少一些東西。對不起,現在檢查它。 – 2011-04-21 23:02:06