我有一个网站,我正在使用php构建,允许多语言的内容。该网站的一部分将有商家信息。我有SEO友好的网址设置来查看这些列表,所以例如我会有一个名为“街上的酒吧”的商家列表。网址看起来像这样:
/listing/a-bar-down-the-street
但是,假设这个列表有阿拉伯语版本,那么名称将如下所示:
شريطأسفلالشارع
我如何将其制作成与英文版相同的网址格式,但是使用的语言是什么?当我在阿拉伯语版本上尝试我的函数时,将一个字符串转换为一个友好的URL,它就会变回空白。
修改 为了进一步澄清,我正在寻找的是一个php函数,它允许我将任何字符串转换为SEO友好URL,无论该网站使用何种语言。
编辑第2部分 下面是我用来将字符串重写为SEO友好网址的函数。也许你可以告诉我我需要添加什么来使它语言友好?
public function urlTitle($str,$separator = 'dash',$lowercase = TRUE)
{
if ($separator == 'dash')
{
$search = '_';
$replace = '-';
}else
{
$search = '-';
$replace = '_';
}
$trans = array(
'&\#\d+?;' => '',
'&\S+?;' => '',
'\s+' => $replace,
'[^a-z0-9\-_]' => '',
$replace.'+' => $replace,
$replace.'$' => $replace,
'^'.$replace => $replace,
'\.+$' => ''
);
$str = strip_tags($str);
$str = preg_replace("#\/#ui",'-',$str);
foreach ($trans AS $key => $val)
{
$str = preg_replace("#".$key."#ui", $val, $str);
}
if($lowercase === TRUE)
{
$str = mb_strtolower($str);
}
return trim(stripslashes($str));
}
答案 0 :(得分:1)
我在现有的SO discussion中找到了类似的讨论。看来您所要求的应该是“开箱即用”的。
我建议您查看您的网络服务器配置,看看有什么问题,seo友好的英文网址和任何其他可编码网址的字符串之间应该没有区别。
你在运行什么网络服务器?
<强>更新强> 我看到你只接受字母数字字符:
'[^a-z0-9\-_]' => '',
我怀疑可以过滤掉任何非a-z字符并导致空返回。或者,您也可以尝试调试您的函数,以查看哪个替换条件会导致您的内容被删除。
您在这里遇到的问题是,默认情况下,URL不能包含任何字符,通常使用编码的浏览器来实现漂亮的多语言URL。
请参阅link中的示例:
URL只允许使用一组英文字母字符,其中包括数字,短划线,斜线和问号。必须对所有其他字符进行编码,这适用于非拉丁语域名。如果你去فنادق.com,你会注意到有些浏览器会对它进行解码并向你展示فنادق.com。但有些像Chrome会向你显示这样的http://www.xn--mgbq6cgr.com/。
这意味着您无法再过滤帖子标题,只允许使用网址有效的字符,您需要对标题进行编码,并希望浏览器按照您的意愿对其进行渲染。
另一个选择是使用trans-literation,可能是在检测到已知不呈现url编码的特殊字符的浏览器之后。
答案 1 :(得分:0)
所以对我来说似乎有用的是我的php函数的这一部分:
'[^a-z0-9\-_]' => '',
将strtolower行更新为:
$str = mb_strtolower($str,'UTF-8');
它似乎正常工作。但是,任何人都可以确认这将会继续吗?浏览器是否会理解所有语言?或者我是否必须规范化字符串以确保每个浏览器都能理解该URL?问题是我不在php 5.3上,这是安装php的规范化扩展所必需的。如果我升级的话,我担心它会破坏,我目前正在使用5.2x。
答案 2 :(得分:0)
John,你是对的,主要的问题是你的正则表达式字符类([^a-z0-9\-_]
)不允许使用UTF-8字符。这应该更好:[^\p{L}0-9\-_]
我最近一直在研究这样的功能,刚刚发布了一篇博文,内容包括我提出的功能:Creating SEO Friendly URLs in PHP with url_slug()
答案 3 :(得分:0)
我有一个支持 48 种不同语言的网站。我用来清理 url 的函数在这里(在 javascript 中),也许这对你有帮助:
const noHyphenLangs = ['ko', 'ja', 'zh-cn', 'zh-tw', 'ar', 'th']
const formatTranslationIntoPath = (text, symbol) => { // utf-8 encoding
let t = text
const replaceChar = noHyphenLangs.includes(symbol) ? '' : '-'
t = t.replace(/-/g, ' ')
t = t.replace(/\s/g, replaceChar)
t = t.replace(/['`’]/g, '') // remove quotes
t = t.replace(/[,,()]/g, '') // remove junk
t = t.normalize('NFD').replace(/\p{Diacritic}/gu, '') // simplify letters for url https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
t = t.replace(/[Łł]/g, 'l') // doesn't get replaced in diacritic replacements
return t.toLowerCase()
}
const ex1 = formatTranslationIntoPath('让我们 尝试-这样-做', 'zh-cn') // 让我们尝试这样做
const ex2 = formatTranslationIntoPath('Việt miễn phí', 'vi') // viet-mien-phi
PS:对于大多数语言,如果没有可用的变音符号替换,您不希望删除非字母数字字符。
参考:https://gist.github.com/KevinDanikowski/24c79cbb7a3ef2a7f3e452e740848249