多个文本替换字符串内部,同时保留所选变量

时间:2013-01-10 21:50:31

标签: php regex string url wildcard

我有一个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]保存到变量,然后执行替换功能,并插入刚刚保存为的单词来自第一个网址的变量。

EDIT。

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

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

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

1 个答案:

答案 0 :(得分:0)

你是对的,你需要的是正则表达式。 (你需要一个通配符替换是线索)。这个答案不应该是一个完整的解决方案,只是让你了解正则表达式是如何工作的。我将把它与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 //,这使得难以辨认。

但现在这个perl-specificc细节太多了,请阅读php正则表达式文档!