这个reg表达式的问题

时间:2011-05-17 14:26:48

标签: php regex

我对reg表达式有一个奇怪的问题。

我正在尝试以类似这样的字符串取出产品的名称

#T55.08 #J60.91 #M1/1 #YT102/0///Tie                      #G
#T55.08 #J60.91 #M1/1 #YT102/0///Foulard                  #G
#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief      #G

我正在使用tx2re(http://txt2re.com)创建reg表达式但似乎如果产品名称少于4个字符,则reg exp不起作用... 你能帮帮我吗?

这是我的正则表达式

/(#)(T)(55\\.08)( )(#)(J)(60\\.91)( )(#)(M)(1)(\\/1)( )(#)(YT)(102)(\\/0)(\\/)(\\/)(\\/)((?:[a-z][a-z]+))(.)((?:[a-z][a-z]+))/is

6 个答案:

答案 0 :(得分:4)

此表达式将捕获产品的名称:

/#RT55\.08 #J60\.91 #M1\/1 #YT102\/0\/\/\/(.*)#G/

我认为#T55.08 #J60.91 #M1/1 #YT102/0///#G永远不会改变。

答案 1 :(得分:2)

您不需要使用正则表达式解决此问题。如果第一个段始终保持不变,

$string = "#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief      #G";
$title = trim(substr($string, 33, -2));

或者如果它总是在///之后:

$title = trim(substr($string, strpos($string,'///')+3, -2));

此外,substr的运行速度远远超过preg_matchpreg_replace

答案 2 :(得分:1)

在我看来,字符串是给定格式的,行的每一端都有#,而用斜线分隔的行中的字段。

并且可能您知道产品名称将始终以该格式位于相同的字段位置?

在这种情况下,你根本不需要使用正则表达式(当然不是一个像你提出的那样复杂的复杂!)。您可以删除前导和临时#字符并使用斜杠爆炸字符串,并从结果数组中选择适当的元素:

$inputrow = trim($inputrow,'#');
$fields = explode('/',$inputrow);
$product_name = trim($fields[5]);

答案 3 :(得分:1)

如果产品名称始终以///作为前缀,则可以使用:

preg_match('~///(.+?)\s*#G$~', $string, $matches);

产品名称将位于$matches[1]

答案 4 :(得分:0)

如果您只想要产品名称,可以使用此正则表达式:

.*?\/\/\/(.*?)#G

但是,如果字符串的初始部分(即///之前的所有内容)都已修复,则只需使用子字符串即可。

答案 5 :(得分:0)

这看起来真的很复杂。如果您只需要产品名称,则可以使用:

/\/\/\/(.*)#G$/