【发布时间】:2013-11-19 20:39:01
【问题描述】:
我正在使用preg_match 来格式化曲目列表,以便将曲目编号、标题和持续时间分隔到表格中各自的单元格中:
<td>01</td><td>Track Title</td><td>01:23</td>
问题在于曲目本身可以采用以下任何形式(曲目编号和持续时间上的前导零并不总是存在):
01. Track Title (01:23)
01. Track Title 01:23
01. Track Title
1 Track Title (01:23)
1 Track Title 01:23
1 Track Title
以下仅适用于带有时间戳的曲目:
/([0-9]+)\.?[\s+](.*)[\s+](\?[0-5]?[0-9]:[0-5][0-9]\)?)/
所以我在时间戳中添加了?:
/([0-9]+)\.?[\s+](.*)[\s+]((\?[0-5]?[0-9]:[0-5][0-9]\)?)?/
这适用于没有时间戳的曲目,但有时间戳的曲目最终会在标题上加上时间戳,如下所示:
<td>01</td><td>Track Title 01:23</td><td></td>
编辑:曲目列表是纯文本的,在解析之前从 SQL 表中提取。
【问题讨论】:
-
+1 为您的尝试。使用 html 解析器不会更容易吗?想想phpQuery。
-
您总是可以做一些逻辑并使用多个正则表达式 - 例如检查字符串末尾附近的“:”是否存在,然后使用一个正则表达式以任何格式获取时间戳。这种方法的优点是,当你发现另一个极端情况(比如一首名为 0:00 的歌曲或其他东西)时,修复比尝试修复一个巨大的正则表达式更容易。
-
@Karl 与您最后一次编辑,你的意思是没有
<td>标签? -
@HamZa 抱歉,我忘了补充说曲目列表是纯文本的。所以是的,没有 html 标签。
-
@Karl lolwut,那你为什么要添加它。我来到了这个
(\d+)\.?\s*(.*?)\s*(\(\d+:\d+\)|\d+:\d+|$)解决方案。如果需要,您需要遍历第 3 组并修剪()...
标签: php regex preg-match