我需要在LTR页面上内联显示一些RTL文本。
我将国家/地区名称以英文名称(LocalLanguageName)格式存储在MySQL数据库的单个字段中。当本地语言是RTL文本时,我的PHP创建的输出就会被破坏。
例如,以色列存储在数据库中:
Israel (ישר×ל)
我的PHP代码是:
print "<li>$row[Country], ";
print date('jS M Y',strtotime($row[StartDate]));
print "</li>\n";
哪个输出:
<li>Israel (ישראל), 1st Jan 2013</li>
如果我删除了日期行,则右括号和逗号位于正确的位置。
如果我把"x".
放在我得到预期的日期之前:
<li>Israel (ישראל), x1st Jan 2013</li>
将dir="LTR"
添加到<li>
元素不起作用,因为输出html不正确。
如何获得<li>LTR name (RTL name), date</li>
的输出?
由于
答案 0 :(得分:1)
它与PHP没什么关系,但是使用HTML和Unicode双向算法。您似乎总是在国家/地区名称后面添加一个数字,并且该算法对与具有不同方向性的单词相邻的数字进行了一些魔术。有时候这种魔法很有用,有时却没有。
如果您的一般环境主要是英语,那么最简单的方法就是添加HTML实体&amp; lrm;在国名后的括号后面。你甚至不需要条件而且你可以在所有的国名之后这样做 - 它在从左到右的国家名称后不会受到伤害。
更优雅的方法是将国家/地区名称(包括括号中的部分)放在HTML标记&lt; bdi&gt;中。这意味着&#34;双向隔离&#34 ;;简单来说,它就像一个&lt; span&gt;标签,但它以一种阻止答案开头提到的双向魔法的方式隔离其内容。虽然它更优雅,但这种方法有一个缺点:它不能在Microsoft Internet Explorer中工作(看到它?)。如果您不太关心Microsoft Internet Explorer,我建议使用&lt; bdi&gt ;.
答案 1 :(得分:0)
阿拉伯字符将解析器设置为RTL模式,忽略标点符号,英文字母表中的字母触发解析器返回LTR模式(这就是为什么添加OP {'修复'中提到的x
字符的原因输出),但数字仍然被认为是RTL,因此日期的数字仍然被认为是RTL字符串的一部分,标点符号),
也被它们捕获。
您可以使用UTF-8从左到右标记强制解析器重新进入LTR模式:
print "<li>$row[Country]\xe2\x80\x8e, ";
结果是:
<li>Israel (ישראל), 1st Jan 2013</li>