我有一个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
属性。
答案 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正则表达式文档!