关于定义列表的正则表达式问题redux

时间:2009-12-12 04:17:07

标签: php regex

试图找出一种方法来抛弃此数据中没有任何值的属性。谢谢你的帮助。

我目前的正则表达式代码,感谢Tomalak看起来像这样

正则表达式

([^=|]+)=([^|]+)(?:\||$)

正则表达式替换

<dt>$1</dt><dd>$2</dd>

数据看起来像这样

  

刷毛材料= |线材=钢|直径= 4 in |砂砾= |刷毛直径= |线尺寸= 0.0095 in | Arbor Diam = |刀杆螺纹 - TPI或螺距= 1/2 - 3/8 in |没有。 of Knots = |面宽= 1/2 in |面板厚度= 7/16 in | Trim Length = 7/8 in | Stem Diam = | Speed = 6000 rpm [Max] | No。的行数= |颜色= |轮毂材料= |结构= |工具形状= |应用=清除锈蚀,污垢和污垢,轻度去毛刺,边缘混合,粘合粗糙,电镀或涂漆前的精加工准备|适用材料= |类型= |用于=直磨机,台式/立柱式磨床,直角磨床|包装类型= |数量=每包1个| Wt。=

最终结果应该是这样的

 <dt>Wire Material</dt><dd>Steel</dd><dt>Dia.</dt><dd>4 in</dd><dt>Wire Size</dt><dd>0.0095 in</dd>

不是这个

 Bristle Material=|<dt>Wire Material</dt><dd>Steel</dd><dt>Dia.</dt><dd>4 in</dd>Grit=|Bristle Diam=|<dt>Wire Size</dt><dd>0.0095 in

3 个答案:

答案 0 :(得分:2)

以下是如何在不使用正则表达式的情况下在PHP中执行此操作:

$parts_list = explode('|', "Bristle Material=|Wire M....");
$parts      = "";

foreach( $parts_list as $part ){
    $p = explode('=', $part);
    if(!empty($p[1])) $parts .= "<dt>$p[0]</dt>\n<dd>$p[1]</dd>\n";
}

echo $parts;

以下是使用正则表达式的方法:

$parts = preg_replace( 
    array('/([^=|]*)=(?:\||$)/','/([^=|]*)=([^|]+)(?:\||$)/'),
    array('', '<dt>$1</dt><dd>$2</dd>'),
    $inputString 
);

echo $parts;

<强>更新

这是使用PHP preg_replace的一个特殊替换功能,它采用一组正则表达式和一个替换字符串数组。函数的array()语法基本上等同于:

  

如果我可以匹配:/([^=|]*)=(?:\||$)/然后用空字符串替换它   如果我可以匹配:/([^=|]*)=([^|]+)(?:\||$)/,请将其替换为<dt>$1</dt><dd>$2</dd>

要在Regex编辑器中测试它,首先运行第一个表达式(/([^=|]*)=(?:\||$)/),然后在第一个表达式的结果上运行第二个表达式。

答案 1 :(得分:0)

([^=|]*)=([^|]*)(?:\||$)

跳过没有值的那些,试试这个:

(?:[^=|]*=|([^=|]*)=([^|]+))(?:\||$)

答案 2 :(得分:0)

好像你想要preg_match而不是preg_replace

 preg_match_all('~([^|]+)=([^|\s][^|]*)~', $str, $matches, PREG_SET_ORDER);
 foreach($matches as $match)
      echo "<dt>{$match[1]}</dt><dd>{$match[2]}</dd>\n";