可识别某些文本的功能

时间:2013-04-23 18:00:11

标签: php function

这是我的问题。我会尽量保持简洁:

我有一个wab页面,用这样的语言显示文本:

  

<p><?php echo $langFile->data->message; ?></p>

实际文字可能如下所示:

  

您好,%1。你有%2个订单。如果您忘记%密码,请点击%here%!

所以我必须编写一个函数,可以替换(每次替换一次)%1和%2用某些文本,并且之间的单词用链接文本替换。它很棘手的原因是我可以看到这样的文字:

  

Bla bla%1,bla %yada yada%2 yada% bla bla bla。

所以在这里,该函数必须用可链接的文本替换 %yada yada%2 yada% ,再次调用时,可以用另一个文本替换%2。

我是编程的新手,所以我可以使用一些指针,因为我不知道如果可能的话,如何到达我想要的位置。非常感谢。

此致

3 个答案:

答案 0 :(得分:1)

$whatever = explode('%', $something);

然后像任何其他数组一样运行它。如果你能找到一个共同的分母并将其爆炸,你通常可以获得正则表达式的任何难题,或者如果/然后按你需要的方式工作。事后,逻辑实际上就会显现出来。

作为示例,我试图找到一种方法来保证删除所有脚本标记。老实说,没有人的正则表达式工作。然后,我在html中找到了我可以使用的共同点。我想出了这个。它将保证剥离所有脚本标记。当然,脚本标签只是这么简单,因为它们不会嵌套。然而,它是一个很好的例子,说明如何使用“爆炸逻辑”或“手风琴编码”来让你的思绪解决问题并实现它。

$h = explode('>', $html);

foreach($h as $k => $v){
    $v = trim($v);
    if(preg_match('/^(<script[.*]*)/ius', $v)){
        $counter = $k;//starting key of the script stored for later
        }elseif(preg_match('/([.*]*<\/script$)/ius', $v)){
            $script = $k - $counter;//difference between opening and closing tag
            $counter = 0;//reset counter for next script
            for($i = $script; $i >= 0; $i--){//now use the keys to empty everything in between
                $h[$k-$i] = '';
                }
            }           
        }
for($i = 0; $i <= count($h); $i++){
    if($h[$i] != ''){
        $ht[$i] = $h[$i];//clean out the blanks so when we implode it works right.
        }
    }
$html = implode('> ', $ht);//all scripts stripped.GUARANTEED

我相信你可以对你想要做的事情使用同样的想法。虽然你的内部陈述会有所不同,但你会开始看到它如何更容易流动并实际显示你想要做的事情的进展。

答案 1 :(得分:1)

不是使用%,而是可以在文本中使用字符串变量(除非你编写某种动态的东西,允许人们像CMS一样添加自己的变量)。您可以使变量来自数据库或类似的不同语言。例如:

$name = 'Bob';
$salutation = "Hello, $name.";
$order_count = '2';
if ($order_count == '1'){
  $ordertext = "You have $order_count order.";
} else{
  $ordertext = "You have $order_count orders.";
} 
$forgot = 'forgot';
$link = 'http://www.domain.com/reset/password';
$forgotphrase = "If you $forgot your password click <a href='$link'>here</a>!";

$message = $salutation.$ordertext.$forgotphrase;

<强>输出

Hello, Bob. You have 2 orders. If you forgot your password click here!

<强>更新

要在更大规模上执行此操作,您可以拥有一个名为“phrasing”的数据库表。

id,salutation,ordertext_plur,ordertext_sing,forgot,link,forgotphrase,language,updated

所以在MySQL中可能看起来像这样:

1,
'Hello, $name.',
'You have $order_count orders.',
'You have $order_count order.',
'forgot',
'http://www.domain.com/reset/password/en',
'If you $forgot your password click <a href='$link'>here</a>!',
'EN',
'2013-04-23 00:00:00'

您的SQL语句如下所示:

select * from phrasing where language='EN';

然后,您将根据输出分配适当的变量。您将不得不更多地考虑如何实现它以及数据库应该有多大。

其他想法您可以考虑在页面上使用类似Google Translate Gadget的内容来翻译HTML代码,而不是将翻译硬编码到数据库中。他们的翻译数据库每天更新。我的一些大型国际客户使用它而不是付钱翻译成每种语言。此外,它还可以更容易地用一种语言更改代码,而不必担心在其他语言中遗漏它。

答案 2 :(得分:1)

试试这个:preg_replace http://php.net/manual/es/function.preg-replace.php

%[1-9]%1%2%3可能是%[A-Za-z ]+%

有一些重要内容... 您应该将%更改为其中一个案例的任何其他特征......这样可以更轻松地进行搜索,因为......

这种情况很简单:Hello, %1. You have %2 orders. If you %forgot% your password click %here% ! 这不是:Bla bla %1, bla %yada yada %2 yada% bla bla bla. 但是,例如,这更容易:Bla bla #1, bla %yada yada #2 yada% bla bla bla.