搜索并替换随机单词

时间:2014-12-03 11:16:13

标签: php arrays design-patterns random

好吧,首先让我说,在发布之前我已经测试了很多东西,很多时候,但是目前,我实际上并不知道还能做什么,因为没有什么能适合我。

这是我目前的代码:

<?php
// These are the arrays given by the application. All of them has an "%s" within.
// For example...
$arrs = array(
    "this is a %s array" => "converted1 %s text", 
    "value %s test" => "converted2 %s text", 
    "test %s test" => "converted3 %s text"
); 

$text = "This is a random text. Which can contains or not some of the expressions listed above. In this case it contains this: this is a magic array, value hey test, test php test";

// The output should be:
// "This is a random text. Which can contains or not some of the expressions listed above. In this case it contains this: CONVERTED magic TEXT, CONVERTED2 hey TEXT, CONVERTED3 php TEXT"

foreach($arrs as $k => $v){
    // Seriously, I don't know what's next here... also I'm thinking this foreach is not right here.
}

?>

主要目标是在文本框输入中随机写一些东西。所以我在文本框中检查是否填写了一些数组键($arrs)。问题是我无法使用strpos检测到它,因为%s将始终是随机的,所以找到它的位置有点难......

假设我写“这是一个随机数组”(它是在数组中),所以如果我们检查它的值,我们会看到它将是“converted1 RANDOM text”。

我已经测试过使用模式,还有explode();preg_replace_callback,但对我来说没有任何作用。这真让我疯狂......

非常感谢你们。

1 个答案:

答案 0 :(得分:0)

使用正则表达式。

<?php
$pattern = '~this is a ([^ ]*) array~U';
$replace = 'converted1 $1 text';
$text = preg_replace($pattern,$replace,$text);

您已经拥有了关联数组,您可以将关键字更改为正则表达式和值以替换字符串(使用上面的 $ 1 等转义组)。也可以在 foreach()中进行检查:

<?php
if (preg_match($k,$text)) {
    // do the replacing here
}

注意: 我使用 [^] * 来匹配单个字词。它不仅是方式,它可能不是最好的方式。您也可以使用 \ w ,但我个人不喜欢它。)

修改

在这里,您可以使用现成的代码(仅在我的XAMPP上测试)

<?php
$arrs = array(
    "~this is a ([^ ]*) array~U" => "converted1 $1 text", 
    "~value ([^ ]*) test~U" => "converted2 $1 text", 
    "~test ([^ ]*) test~U" => "converted3 $1 text"
); 

$text = "This is a random text. Which can contains or not some of the expressions listed above. In this case it contains this: this is a magic array, value hey test, test php test";

foreach($arrs as $k => $v){
    if (preg_match($k,$text)) {
        $text = preg_replace($k,$v,$text);
    }
}

?>