2010-10-31 54 views
2

我确定有人问过这个问题,但在google上搜索了1个多小时后,我决定在这里问我的问题。Preg match question

我想遍历数组感兴趣的不同字符串/文本。 这些文本包含与两个## valuetoreplace ##和#valuetoreplace#

我想对preg_matches字符串:

$pattern = '/^#{1}+(\w+)+#{1}$/'; 
if(preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) 
{ 
    // do something with the #values# 
} 

$pattern = '/^#{2}+(\w+)+#{2}$/'; 
if(preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) 
{ 
    //do something with the ##value## 
} 

这个伟大的工程。 现在我唯一的问题是:

时,我有一个字符串像

$valueToMatch = 'proceding text #value#'; 

我的preg_match不能找到我的价值了(因为我使用了^和$)。

问题:如何找到#value###value##,而不必担心这些单词是否在(多行)值的中间?

*另外: 我想要的是找到模式并用数值替换#值#和一个##value##。 例如:

$thingsToReplace = 'Hello #firstname# #lastname#, 
How nice you joined ##namewebsite##.'; 

应该

'Hello John Doe, 
How nice you joined example.com.' 
+0

如果这些单词处于(多行)值*的中间,那么您无需担心什么意思?你是否希望跨越多少线? – 2010-10-31 13:57:11

回答

1

试试这个:/##([^#]+)##//#([^#]+)#/,按照这个顺序。

+0

我已经试过这个。唯一的问题是。在这种情况下,## value ##也是正确的,因为#value#是[#]#value#[#]的一部分 – Arthur 2010-10-31 14:01:13

+2

在这种情况下,运行正则表达式来替换'## valuetoreplace ##'* first *所以那些将全部消失,然后*运行正则表达式来替换'#valetoreplace#'。如果按顺序执行,则不会出现上述问题,因为## valueetoreplace ##'的所有实例都将消失。 – Asaph 2010-10-31 14:05:21

+0

这是一个好主意。谢谢阿萨夫 – Arthur 2010-10-31 14:09:57

0

也许很高兴知道其他游客我是怎么做的:

foreach($personalizeThis as $key => $value) 
{ 
    //Replace ##values## 
    $patternIniData = '/#{2}+(\w+)#{2}/'; 
    $return = 'website'; //testdata 
    $replacedIniData[$key] = preg_replace($patternIniData, $return, $value); 

    //Replace #values# 
    $pattern = '/#{1}+(\w+)#{1}/'; 
    $return = 'ASD'; //testdata 
    $replacedDbData[$key] = preg_replace($pattern, $return, $replacedIniData[$key]); 
} 

回报$ replacedDbData;