PHP JavaScript regex taşıma

3 Cevap php

Ben PHP aşağıdaki regex vardır:

/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/

ve javascript gibi liman bunu istiyorum:

var regex = new RegExp('/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/');

var match = regex.exec("hello,my,name,is,'mr jim'")

for( var z in match) alert(match[z]);

Orada JavaScript gibi burada yok bir şey, ama ne olduğunu hiçbir fikrim yok. Ben düzenli expressions.info yoluyla PHP ve JS regex arasında diferences arıyor denedim ama belirgin bir şey göremiyorum.

Herhangi bir yardım büyük mutluluk duyacağız

Tekrar teşekkür ederim

EDIT: The problem seems to lie within the positive lookbehind's but does this mean it cannot be ported?

3 Cevap

Sen Geriye bakan alamadım (ve ileri yönlü böylece isimli en çok kaçınılması, IE sorunları var). Ama sadece o 'izin vermedi ve "karakterleri maçın parçası olmak, ve sonra onları dışarı atmak kolay:

var value= "hello,my,name,is,'mr jim'";
var match;
var r= /'[^'\s][^']*'|"[^"\s][^"]*"|[^'",\s]+/g;

while(match= r.exec(value)) {
    var text= match[0];
    if ('"\''.indexOf(text.charAt(0))!=-1) // starts with ' or "?
        text= text.substring(1, text.length-1);
    alert(text);
}

Ya da, metinden tırnak izole etmek için yakalama parantez kullanımı:

var r= /'([^'\s][^']*)'|"([^"\s][^"]*)"|([^'",\s]+)/g;

while (match= r.exec(value)) {
    var text= match[1] || match[2] || match[3];
    alert(text);
}

(Ben tahmin ediyorum senin for(var z in match) dizesindeki her desen maç üzerinde döngü gerekiyordu. Yazık ki JavaScript kolayca oldukça işe değil.)

Bu bir virgülle ayrılmış listesini ayrıştırmak için en iyi yol olmayabilir; biraz kötü tanımlanmış bir alanın ortasında bir boşluk veya alıntı durumlarda görünüyor. Basit bir dize endeksleme ayrıştırıcı daha iyi bir bahis olabilir.

Doğru - pozitif geriye ilerleme çalışmaz.

Ancak, sadece JavaScript regex hakkında bazı genel bilgiler gibi, burada sizin için bir kaç ipucu verilmiştir.

Sen RegExp nesnesini kullanmak zorunda değilsiniz - yerine desen değişmezleri kullanabilirsiniz

var regex = /^[a-z\d]+$/i;

Eğer RegExp nesnesini kullanmak Ama eğer senin desen artık bir dize kilitli beri backslash'lar kaçmak zorunda.

var regex = new RegExp( '^[a-z\\d]+$', 'i' );

Senin desene bir dinamik bit örneğin, varsa RegExp nesnenin birincil yararı

var max = 4;
var regex = new RegExp( '\d{1,' + max + '}' );

bu kadar (?<=) Javascript desteklemiyor ne görünüm arkasında pozitif. ancak farklı tarayıcılarda JavaScript uygulaması önemli ölçüde değişebilir unutmayın.

Edit, bir SO question devoted to workaround yoktur.