Php 如何使用Javascript传输替换函数替换多个字符?
我使用以下代码:Php 如何使用Javascript传输替换函数替换多个字符?,php,javascript,replace,Php,Javascript,Replace,我使用以下代码: <script type="text/javascript"> function transfer(which) { which = which.replace(/[\-]+/g,'-'); // to remove extra hypens which = which.replace( 'č', 'c' ); which = which.replace( 'ē', 'e
<script type="text/javascript">
function transfer(which) {
which = which.replace(/[\-]+/g,'-'); // to remove extra hypens
which = which.replace( 'č', 'c' );
which = which.replace( 'ē', 'e' );
which = which.replace( 'ģ', 'g' );
which = which.replace( 'ī', 'i' );
which = which.replace( 'ķ', 'k' );
which = which.replace( 'ļ', 'l' );
which = which.replace( 'ņ', 'n' );
which = which.replace( 'ū', 'u' );
which = which.replace( 'ž', 'z' );
which = which.replace( 'š', 's' );
which = which.replace( 'ā', 'a' );
which = which.replace(/\s/g,'-'); // to replace spaces with hypens
which = which.replace(/[\-]+/g,'-'); // to remove extra hypens
which = which.replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase(); // to convert to lower case
document.getElementById("url_slug").value = which;
}
</script>
JavaScript中没有内置函数来实现这一点,但您可以非常轻松地创建自己的函数。在一个对象中创建一个俄语到拉丁语的映射,然后使用
for..in
在该对象上循环。对于循环处理的每个键值对,执行替换
function transfer(which) {
// define a Russian-to-Latin mapping object
var map = {
'б':'b',
'в':'v',
// all the rest ...
};
// replace non-Latin chars with Latin replacements
for(cyr in map) {
var lat = map[cyr];
which = which.replace(new RegExp(cyr, 'g'), lat);
// Or without RexExp:
// which = which.split(cyr).join(lat);
}
// general cleanup
which = which.replace(/\s/g,'-') // spaces to hyphens
.replace(/[\-]+/g,'-') // remove duplicate hyphens
.replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase();
// show the result
document.getElementById("url_slug").value = which;
}
请注意,replace
与字符串一起用作其第一个参数时,它只替换字符串的第一个实例(例如,“aaa”。replace('a','b')
返回“baa”
,而不是“bbb”
)。您需要使用全局正则表达式多次替换字符串,就像我在示例中所做的那样。只要确保你的俄语没有任何特殊的正则字符,比如^
,$
,(
,)
,等等(但从你的例子来看,我猜这不会是个问题)或者,您可以使用我作为注释添加的拆分
/加入
解决方案
根据您的需要,您可以提供
map
对象作为参数,而不是将其内置到函数中。朋友,javascript中没有类似stru\u replace
的内置方法。。。但是您可以通过创建一个同名函数来创建此方法。。。在javascript文件中或html页面的script
标记下附加以下函数
function str_replace(search, replace, subject){ // same as php
for(var i=0;i<search.length;i++){
subject=subject.replace(new RegExp(search[i],"g"),replace[i]);
}
return subject;
}
如果要将方法名
str\u replace
更改为其他名称,只需更改函数名…谢谢。它工作得很好,但仅限于如何在代码中实现:which=which.replace(/\s/g,“-”);//将空格替换为hypens which=which.replace(/[\-]+/g,'-');//删除额外的hypens,其中=which.replace(/[^a-zA-Z0-9\-]/g',).toLowerCase();//要转换为小写形式,我为此编辑了一些代码——您可以将replace
调用链接在一起,就像我在“常规清理”部分所做的那样。这样,您就不必多次写出“which=which.replace(…);
”;您只需添加更多.replace(…)
调用。没有办法将其缩短,因为“空格到连字符”的替换必须在“删除重复连字符”的替换之前进行。谢谢。但这一次代码不起作用。使用第一个代码时,除空格移除器外,所有代码都工作正常。也许有可能以某种方式进行更改?我的原始代码结束了返回,但后来我更改了它以匹配您在原始代码中使用的最后一行getElementById
。这可能是问题所在吗?(顺便说一句,我添加了一个更安全的解决方案,它不需要将字符串传递到RegExp构造函数。)
function str_replace(search, replace, subject){ // same as php
for(var i=0;i<search.length;i++){
subject=subject.replace(new RegExp(search[i],"g"),replace[i]);
}
return subject;
}
var cyr = ['а','б','в','г','д','e','ж','з','и','й','к','л','м',
'н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ',
'ъ','ь','ю','я','А','Б','В','Г','Д','Е','Ж','З','И',
'Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х',
'Ц','Ч','Ш','Щ','Ъ','Ь', 'Ю','Я'],
lat = ['a','b','v','g','d','e','zh','z','i','y','k','l','m',
'n','o','p','r','s','t','u','f','h','ts','ch','sh',
'sht','a','y','yu','ya','A','B','V','G','D','E','Zh',
'Z','I','Y','K','L','M','N','O','P','R','S','T','U',
'F' ,'H' ,'Ts','Ch','Sh','Sht','A','Y','Yu','Ya'];
textcyr = str_replace(cyr, lat, textcyr);