2013-01-10 27 views
0

我有一个网页脚本,创建一个PHP页面到一个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酒吧,因为这是在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属性中搜索。

+0

我希望downvoter认为你需要做更多的功课之前问...我不同意,我会尽快给你一个部分答案... – foundry

+0

非常感谢队友...谢谢:) –

回答

0

你是对的,你需要的是一个正则表达式。 (你需要一个通配符替换是线索)。这个答案不应该是一个完整的解决方案,只是给你一个想法如何正则表达式的工作。我将它留给你这个用PHP(试行preg_match_all)

这是要匹配的模式整合:

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

的\是那些在正则表达式

特殊meaing字符转义

所以忽略了逃逸,这是

"?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; 

请注意,您需要逃避你quotemarks 。这可能会在PHP中有所不同。

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


只是让你知道你正在寻找(你不会需要做到这一点在PHP)是什么?

=~是Perl的正则表达式运算符(你会不会在PHP中使用此,看看该文件的preg_match)

那么你有形式

s|match_pattern|replace_pattern|g; 

其中S表示替换(而不是简单的匹配) g表示全局匹配(否则进程将在第一次匹配时停止) |||是分隔符。通常写成///,但那么你将不得不逃避所有的URL/s,这使得模糊不清。

但是,这是现在太多perl特定的细节,阅读php正则表达式文档!

+0

看起来像我需要的队友...将有一场比赛,当我下班回家时,大约一个小时的路程大声笑.....但我会在PHP编码不perl ...我很不错,大多数的PHP,但perl对我来说是一个全新的概念:) –

+0

非常感谢,虽然...它的正则表达式我wouldnt有线索...谢谢:) –

+0

正则表达式的原则是相当语言中立。我已经做了一些从PHP到Perl的代码移植,实际的正则表达式字符串根本不需要改变。 – foundry

相关问题