这是我的问题。我会尽量简明扼要:
我有一个wab页面,显示所选语言的文本,如下所示:
<p><?php echo $langFile->data->message; ?></p>
实际文本可以如下所示:
你好,%1。您有%2个订单。如果您%忘记了%密码,请单击%此处%
因此,我必须编写一个函数,该函数可以用某些文本替换(每次替换调用一次(%1和%2,并用链接文本替换%之间的单词。这很棘手的原因是我可以有这样的文本:
Bla Bla%1,Bla%yada yada%2 yada%Bla Bla Bla。
因此,在这里,函数必须用可链接的文本替换%yada-yada%2-yada%,并且当再次调用时,可以用另一个文本替换%2。
我对编程有点陌生,所以我可以使用一些指针,因为如果可能的话,我不知道如何到达我想要的位置。提前非常感谢。
问候
$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
我相信你可以在你尝试做的事情中使用同样的想法。虽然你的内部陈述会有所不同,但你会开始看到它如何更容易地流动,并实际显示你尝试做什么的进展。
试试这个:preg_replace
http://php.net/manual/es/function.preg-replace.php
对于%1
可以是%[1-9]
,对于另一个可以是%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.
您可以在文本中使用字符串变量,而不是使用%
(除非您正在编写某种动态的东西,允许人们像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!
更新
要在更大的范围内做到这一点,你可以有一个名为"短语"的数据库表。
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';
然后根据输出分配适当的变量。你必须更多地考虑如何实现这一点,以及数据库应该有多大
其他想法您可以考虑在页面上使用类似谷歌翻译小工具的工具来翻译HTML代码,而不是将翻译硬编码到数据库中。他们的翻译数据库每天都在更新。我的一些大型国际客户使用它,而不是花钱翻译成每种语言。此外,它还可以更容易地用一种语言更改代码,而不必担心在其他语言中丢失代码。