2010-11-10 57 views
2

我有以下字符串:正則表達式選擇比我更想(PHP)

blah blah yo<desc>some text with description - unwanted 
text</desc>um hey now some words yah<desc>some other description text 
stuff - more unwanted here</desc>random word and ; things. Now a hyphen 
outside of desc tag - with other text<desc>yet another description - unwanted 
<desc>and that's about it. 

(注意:在現實中有字符串中沒有換行/回車我只加了他們這裏閱讀)

我想從連字符僅選擇遞減標籤的文字前方,也包括前面的空間,也包括結束遞減標籤。這很簡單,因爲我只是這樣做:

\ s - 。*? < \ /遞減>

現在的問題是,這是遞減的標籤外的連字符是越來越選得過。所以我所有的選擇如下:

- unwanted text</desc> 
- more unwanted here</desc> 
- with other text<desc>yet another description - unwanted</desc> 

所以前兩個是完美的,但看到最後一行是如何搞砸因爲 - 在遞減標籤外?

僅供參考,如果有興趣,在我的代碼,我做了替換這樣的:

$text = preg_replace('/\s-.*?<\/desc>/', '</desc>', $text); 

我試着做一些回顧後的東西,但無法得到它的工作。

任何想法?

謝謝! 馬克

回答

1

你可以嘗試[^-<>]*,而不是.*?。這限制了正則表達式可以選擇的內容,並有效地將尖括號和連字符視爲記號。

+0

你的意思是'[^ - <>] *',對吧? – 2010-11-10 17:23:56

+0

@Tim:是的。我將使用-nodeadkeys從此.. – mario 2010-11-10 17:25:02

+0

哇!這很好。我是否會過多地解釋這種改變是如何工作的?謝謝! – user390480 2010-11-10 17:31:00

1

如果說明是可以出現在該塊只有標籤,你可以使用一個可怕的黑客就像這樣:

$text = preg_replace('/\s-[^<]*?<\/desc>/', '</desc>', $text); 

但是,如果這需要防彈,你不能用正則表達式來可靠地做到這一點。您可以嘗試使用XML解析器並處理結果DOM。