【问题标题】:Why doesn't this PHP preg_replace() work?为什么这个 PHP preg_replace() 不起作用?
【发布时间】:2009-03-05 05:46:30
【问题描述】:

我有一些错误的 MySQL 条目需要修复。我正在尝试在 PHP 中这样做。

我有什么

a whole bunch of text with no numbers Entry #:2439. a whole bunch of text Click here to blah blah blah

我想要什么

a whole bunch of text with no numbers Entry #:2439. a whole bunch of text <BR><A href="somepage.php?entry_no=2439">Click here to blah blah blah</A>

我的 PHP 代码

$fixed = preg_replace('/(.*)(\d*)(.*)(Click here.*)/i',"$1$2$3<BR><A href=\"somepage.php?entry_no=$2\">$4</A>",$originalData);

由于某种原因,这就是我得到的:

a whole bunch of text with no numbers Entry #:2439. a whole bunch of text &lt;BR&gt;&lt;A href="somepage.php?entry_no="&gt;Click here to blah blah blah&lt;/A&gt;

$2 没有第二次给我这个数字。有人有什么想法吗?

【问题讨论】:

  • 不要使用“点击这里”(w3.org/QA/Tips/noClickHere>)。
  • 谢谢大家,但我没有设计这个系统。我只是想解决它。
  • 手动修复网址真的那么难吗?
  • @Gumbo:不,但不幸的是,这不是我的电话。

标签: php mysql regex


【解决方案1】:

这是因为第一个匹配是贪婪的:

鉴于此输入,以下是每个部分匹配的内容:

a whole bunch of text with no numbers Entry #: 2439. a whole bunch of text Click here to blah blah blah

(.*)    // "a whole bunch of text with no numbers Entry #: 2439. a whole bunch of text "
(\d*)   // "" (0 or more numbers)
(.*)    // "" (0 or more characters)

你所要做的就是让第一个匹配不贪心:

(.*?)(\d+)(.*)(Click here.*)

此外,由于您在字符串中定义正则表达式,因此您需要转义斜杠:

"/(.*?)(\\d*) ...

【讨论】:

  • 感谢您的帮助。我添加了?到第一个匹配并转义反斜杠,但它仍然返回相同的结果。
  • 知道了!使用您给我的内容,我尝试将第一个匹配项更改为 (.*Entry #: ) 并且它起作用了。非常感谢。
  • 哦 - 您也可以将 \d* 更改为 \d+ 以确保它至少匹配一个数字。
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2010-10-20
  • 2018-06-26
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多