0

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

编辑。

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

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

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

4

1 回答 1

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.ini 中有所不同。

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


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

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

然后你有表格

s|match_pattern|replace_pattern|g;

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

但这现在是太多 perl 特定的细节,请阅读 php regex 文档!

于 2013-01-10T22:43:45.430 回答