【发布时间】:2012-06-04 20:17:28
【问题描述】:
我想这或多或少是一个由两部分组成的问题,但首先是基础知识:我正在编写一些 PHP 以使用 preg_match_all 来查找以 {} 结尾的字符串的变量。然后它遍历每个返回的字符串,用 MySQL 查询中的数据替换它找到的字符串。
第一个问题是:有什么好的网站可以真正了解 PCRE 表达式的来龙去脉吗?我在 Google 上进行了很多搜索,但到目前为止我能找到的最好的是http://www.regular-expressions.info/。在我看来,那里的信息没有很好的组织,因为我不想在需要编写复杂的正则表达式时寻求帮助,所以请指点我几个网站(或几本书!)这将有助于我以后不必打扰你们。
第二个问题是:我有这个正则表达式
"/{.*(_){1}(.*(_){1}[a-z]{1}|.*)}/"
我需要它来捕获 {first_name}, {last_name}, {email} 等实例。这个正则表达式存在三个问题。
第一个是它将“{first_name} {last_name}”视为一个字符串,而它应该将其视为两个。我已经能够通过检查空间的存在来解决这个问题,然后在空间上爆炸。乱七八糟,但它有效。
第二个问题是它包含标点符号作为捕获字符串的一部分。因此,如果您有“{first_name} {last_name}”,那么它将逗号作为字符串的一部分返回。我已经能够通过简单地使用 preg_replace 删除句点、逗号和分号来部分解决这个问题。虽然它适用于这些标点符号,但我的逻辑无法处理感叹号、问号和其他所有内容。
我对这个正则表达式的第三个问题是它根本看不到 {email} 的实例。
现在,如果您可以、愿意并且有时间简单地将这个问题的解决方案交给我,谢谢您,因为这将解决我眼前的问题。但是,即使您可以做到这一点,请请提供一个 lmgfty,它提供好的网站作为参考和/或一两本书,可以提供关于这个主题的良好教育。由于资金紧张,网站会更好,但如果一本书是解决方案,我会找到钱(假设我当地的图书馆系统无法获得上述数量)。
【问题讨论】:
-
我真的很喜欢Mastering Regular Expressions 这本书。那本书中的内容比您可能永远使用的要多;非常彻底。
-
@JonahBishop:这是一本好书,但不太容易消化;)
-
@ClementSmith:您说它应该将其视为两个,但您的正则表达式是贪婪的。在合适的地方添加几个
?:) -
@JonahBishop:谢谢你的建议。我从图书馆订购了那本书。下周应该会到。