2013-02-15 29 views
0

的第一次出現,我需要做對字符串進行一些清理看起來像這樣:PHP的正則表達式來有條件地替換字符串

$author_name = '<a href="http://en.wikipedia.org/wiki/Robert_Jones_Burdette>Robert Jones Burdette </a>'; 

的通知href標記沒有關閉報價 - 我使用上的DOMParser一張大桌子來提取文本,然後它在這上面寫下來。

我想查看$ author_name中的字符串;

如果第一個>在它之前沒有「之前,替換爲」>以正確關閉標籤。如果可以,跳過並執行下一步。一定不要更換第二個>。

使用PHP的正則表達式,我一直沒能找到一個工作的解決方案 - 我可以砍掉整個事情,並檢查其部分,但這將是緩慢的,我認爲必須有一個正則表達式,可以做我的想。

TIA

+0

通過擺脫「」搜索它的位置和刪除子字符串(或正則表達式替換)。然後搜索'>'或'''或其他任何東西。 – andho 2013-02-15 01:46:49

+0

對我來說真的沒有多大的作用..我不想把它砍掉並重做它,我想檢查這個條件是否存在於正則表達式中,然後替換(希望所有在同一個去) – jmadsen 2013-02-15 01:49:25

+0

爲什麼你想這樣做與正則表達式如此糟糕? – andho 2013-02-15 01:53:17

回答

1

你可以做的是,找到第一個結束標記,帶或不帶雙引號(「),並將其替換(」>):

$author_name = preg_replace('/(.+?)"?>(.+?)/', '$1">$2', $author_name); 
+0

,這使得雙「當已經有一個。 – jmadsen 2013-02-15 02:08:22

+0

對不起,我的部分錯誤,現在它應該工作。 – andho 2013-02-15 02:15:19

+0

完美的作品 - 謝謝你 – jmadsen 2013-02-15 02:20:19

0

http://www.barattalo.it/html-fixer/

下載,然後將其包含在你的PHP。 其餘的是很容易的:

$dirty_html = ".....bad html here......"; 

$a = new HtmlFixer(); 
$clean_html = $a->getFixedHtml($dirty_html); 

是很常見的人要使用正則表達式,但你必須記住,HTML is not regular

+0

有趣的項目 - 我會看看,但肯定有一個簡單的正則表達式來處理這種情況,從數據庫表彈出20次左右,而不是運行整個事情通過char-by-char分析庫? – jmadsen 2013-02-15 01:54:05

+0

@jmadsen,請看看我的編輯,以顯示爲什麼我相信你不應該使用正則表達式。 – Pachonk 2013-02-15 01:58:29

+0

是的,但這是一個非常具體的案例,一個人在許多地方似乎犯了同樣的錯誤,但我無法清除實時數據。我正在清理DomParser正確處理 – jmadsen 2013-02-15 02:10:19