2009-10-15 63 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语句。

在我看来,这是一个更好的方法。