2009-10-15 115 views
2

我構建了一個表單,但表單的某些行可能會返回空白,並使用默認值。我試圖找到搜索的形式輸出,然後刪除,我知道是不是需要的比特的方式 - 它看起來像:在PHP中刪除文本字符串的一部分

<tr bgcolor="#FFFFFF"> 
<td>2E</td> 
<td id="8003">-800</td> 
</tr> 

我使用str_replace()函數有效的一對夫婦位,但我的主要問題是,bgcolor =「#FFFFFF」可以更改爲不同的十六進制值,並且我也可以爲每個可能的結果寫一個str_replace(),但是有沒有像這樣的preg_replace解決方案?這將是一個非常複雜的正則表達式。

回答

1

一個正則表達式匹配十六進制字符串其實很簡單:

/[0-9a-fA-F]+/ 

你可能聽說你應該使用HTML解析器來刪除不需要的節點 - 也許你應該,但如果你知道輸入字符串將會是什麼樣,然後可能不是。

以匹配您的例子,第一行,你需要這樣的正則表達式:

preg_replace("/<tr bgcolor=\"#[0-9a-fA-F]+\">/", '', $string) 
+0

感謝尼克 - 這是完美的 - 我修改它找到我需要的整個字符串。由於各種原因,使用解析器來擺脫不需要的字段比這更不可能工作! – MrFidge 2009-10-15 14:44:41

6

您可以使用正則表達式替換preg_replace()。例如,要刪除一個bgcolor屬性,可能會或可能不會具有可變顏色字符串在那裏:

$s = preg_replace('! bgcolor="#[0-9a-fA-F]{6}"!', '', $s); 

但是,一如既往,它是不推薦使用正則表達式來分析或處理HTML。很多東西都可能出現這種情況:

  • 3個字母的顏色代碼;
  • 屬性上的單引號;
  • 屬性上沒有引號;
  • 變量空格;
  • 大寫屬性;
  • 顏色名稱;
  • rgb(N,N,N)等法定格式;
  • 等等。

而這只是針對您的問題的有限子集。

使用DOM處理方法要穩健得多,其中PHP有幾種變體。請參閱Parse HTML With PHP And DOM

+0

的DOM處理方法是一個很好的建議。我記得當時我正在通過XML和HTML預先匹配我的方式。感謝上帝,那些日子已經結束了。 – Jake 2009-10-15 13:56:41

+1

Hiya,這確實是一個好主意,但我擔心在這種情況下它不會像一個好的正則表達式一樣容易。我知道表單輸出的是什麼,所以正則表達式就像房屋一樣安全。該表格是動態生成的 - 用戶可以添加行,執行操作等。 – MrFidge 2009-10-15 14:46:50

0

在嘗試顯示它之前,您不能只是在代碼中檢查字段是否爲「空白」?或者放入一些邏輯來不輸出,如果它是空白的,不輸出它?

3

難道你不能在PHP中生成正確的HTML,而不需要稍後更改字符串替換?

也許有一些IF ELSE語句。

在我看來,這是一個更好的方法。