【问题标题】:multiple text replace inside a string, while keeping the selected variable字符串内的多个文本替换,同时保留所选变量
【发布时间】:2013-01-10 21:50:30
【问题描述】:

我有一个 Web 脚本,它可以将 HTML 页面创建为 PHP 字符串,然后将其传递给用户。所有页面均由 index.php 生成,具有唯一的 url。

domain.host.com/index.php?loadpage=/BLAH

主页是静态 HTML,但所有其他页面都是动态生成到此 PHP 字符串中的。这看起来像是在漫无边际,只是试图提供尽可能多的信息。我创建了一个 javascript 代码来修改链接 url:

 <a href="http://domain.com/BLAH" onclick="location.href='?loadpage=/BLAH'; return false;" title="BLAH Description">BLAH Link</a>

这基本上在状态栏中显示了漂亮整洁的链接,但是 javascript 将它发送到我想要的 URL(我不需要修改 url 栏,因为这是在 iframe 中)

这些链接在静态页面上很好。但是在 PHP 字符串中动态生成的页面上,这有点困难。我需要在字符串中搜索每次出现:

href="?loadpage=/ [WILDCARD] " title=

并将其替换为:

href="http://domain.com/ [WILDCARD] " onclick="location.href='?loadpage=/ [WILDCARD] '; return false;" title=

这对我来说似乎很复杂,我认为可能是 ereg / preg match / replace,但对正则表达式一无所知。

简而言之,我需要某种方式来搜索包含完整页面 html 的 php 字符串,并用第二个字符串替换第一个字符串(在每次出现带有 '?loadpage/' 的链接时。但每个链接将有一个不同的[WILDCARD],所以我假设脚本需要找到每个出现,将[WILDCARD] 保存到一个变量中,然后执行替换功能,并插入刚刚保存为变量的单词第一个网址。

编辑。

只是为了澄清原始链接的样子:

<a id="random" href="?loadpage=/BLAH" title="BLAH Title"></a>

这就是为什么我只从href 属性中搜索。

【问题讨论】:

  • 我希望反对者认为你需要在提问之前做更多的功课......我不同意,我会尽快为你提供部分答案......
  • 非常感谢队友...谢谢:)

标签: php regex string url wildcard


【解决方案1】:

你是对的,你需要的是一个正则表达式。 (你需要一个通配符替换是线索)。这个答案不应该是一个完整的解决方案,只是让您了解正则表达式的工作原理。我会留给你将它与 php 集成(尝试 preg_match_all)

这是你要匹配的模式:

"\?loadpage=\/([^"]*)"

\ 是正则表达式中具有特殊含义的字符的转义符

所以忽略转义是

"?loadpage=/   //the start of the string up to the wildcard part

()   // capturing parentheses, indicating a part that 
     // you want to access in the replace string

[^"]*  // any number of occurences of any character that is NOT doublequote
       // ^ is the negation symbol
       // * indicates "zero or more occurrences"


    followed by...
"   doublequote character

现在您需要一个替换字符串...为此您只需要知道您的(捕获括号)允许您回忆匹配的那部分。在大多数正则表达式风格中,您可以将这些捕获到一系列编号的变量中,通常表示为 $1, $2, $3.. \1 \2 \3... 在您的情况下,您只有一个捕获变量要处理。

所以你的替换字符串可能看起来像

"http://domain.com/$1/" onclick="location.href='?loadpage=/$1'; return false"

在 perl 中,您可以像这样将整个事情放在一起:

$string =~ s|"\?loadpage=\/([^"]*)"|"http://domain.com/$1/" onclick=\"location.href='?loadpage=/$1'\; return false"|g;

请注意,您不需要转义引号。这可能在 php 中有所不同。

正如您将看到的那样,它很容易变得非常神秘。 regular-expressions.info 是一个有用的在线参考。


只是为了让你知道你在看什么(你不需要在 php 中这样做)...

=~ 是 perl 正则表达式运算符(你不会在 php 中使用它,请查看 preg_match 文档)

那么你就有了表格

s|match_pattern|replace_pattern|g;

其中 s 表示替换(与简单匹配相反) g 表示全局匹配(否则进程将在第一次匹配时停止) |||是分隔符。通常写成 /// 但是你必须转义你所有的 URL //s,这会加倍难以辨认。

但是现在这个 perl-specific 细节太多了,阅读 php regex 文档!

【讨论】:

  • 这看起来像我需要的伙伴......当我下班回家时会玩,大约一个小时的路程哈哈......但我将在 php 中编码而不是 perl.. . 我对大多数 php 都很好,但 perl 对我来说是一个全新的概念 :)
  • 非常感谢......它是我不知道的正则表达式......谢谢:)
  • 正则表达式原则与语言无关。我已经完成了一些从 php 到 perl 的代码移植,实际的正则表达式字符串根本不需要更改。
  • 好的,谢谢,我试一试,让您知道我的进展情况...感谢您迄今为止提供的帮助!
  • @FlyingShuttleBury - 这可能会有点冗长。也许您可以接受答案,如果您在完成此操作后需要更多帮助,请提出新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多