Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, na verdade a minha questão do RegExp é para uma aplicação javascript, não propriamente PHP, mas como mexo com os dois, entendo que talvez seja mais fácil conseguir ajuda sobre Expressão Regular com pessoas que trabalhem com PHP.
Num exemplo de string assim:
“(abc)(dfg(t)) (hij) t(k) -f(t(l))(u) -h(l) (((s))) x((t)(h))”
Via expressão regular, ou talvez outro método, retornar a string acima em uma array assim:
[“abc”, “dfg”, “t”, “ ”, “hij”, “ ”, “t”, “k”, “ ”, “-f(t(l))”, “u”, “ ”, “-h”, “l”, “ ”, “s”, “x”, “t”, “h”]
Detalhes da operação:
• Os parênteses servem para separar e ao mesmo tempo isolar, visualize o item 6 e 7 da array.
• Note que há a existência da aplicação de funções. Uma função reconhecida no exemplo é -f(), note que neste caso não foi isolado o parênteses e os mesmos foram preservados. No item 11, já não foi preservado, porque -h() não é reconhecido como função, apenas -f foi definida e respeitada.
Com certeza isso eu não conseguirei fazer sem ajuda, por isso se alguém souber como se faz isso pelo php, daí eu posso só converter pra javascript. Seria bom se desse para fazer isso apenas via regex, melhor ainda se fosse utilizado apenas uma linha, mas já entendi que é impossível pelas minhas tentativas, sendo que um dos problemas que enfrentei foi que -f(t(l))(u) sempre ficavam juntos, pois a expressão entendia assim: -f(t(l))(u).
Parte do que vocÊ quer é isto:
beraldo@orion:/tmp$ cat teste.php
<?php
$str = '(abc)(dfg(t)) (hij) t(k) -f(t(l))(u) -h(l) (((s))) x((t)(h))';
preg_match_all( "/\(([a-z]+)\)?/i", $str, $matches );
print_r( $matches[1] );
?> [0] => abc
[1] => dfg
[2] => t
[3] => hij
[4] => k
[5] => t
[6] => l
[7] => u
[8] => l
[9] => s
[10] => t
[11] => h
)
Para pegar as "opções" -f -h etc, basta modificar um pouco a ER, conforme os caracteres que podem ser aceitos em cada local da string.
Existe alguma possibilidade de ultilizar as mesmas regras e expressoes para validacao tanto em php e js?
>
Existe alguma possibilidade de ultilizar as mesmas regras e expressoes para validacao tanto em php e js?
Sim.ER é ER, não importa a linguagem
o que muda são modificadores, nomes de funções, como tratar a ER, o retorno da função etc
>
>
Existe alguma possibilidade de ultilizar as mesmas regras e expressoes para validacao tanto em php e js?
Sim.ER é ER, não importa a linguagem
o que muda são modificadores, nomes de funções, como tratar a ER, o retorno da função etc
Sim, isso eu sei
Eu falo na parte de programação estrutural.
ultilizar todo processo nas duas linguagens com os mesmos nomes, tipo aplicar o nome da função em uma variavel PHP
$validaMail = 'validaMail';
$validaMail_ER = "^([a-z0-9_]|\\-|\\.)+@(([az0-9_]|\\-)+\\.)+[a-z]{2,4}$";
function $validaMail($email){ // $validaMail não sei se é possivel colocar var em nome de função
if(!eregi($validaMail_ER,”$email”)){
return false;
}
}
E aplicar da mesma forma em JS
<js>
<?php include "validamail.php"; ?>
function <?php print $validaMail; ?>(mail){
var er = new RegExp(<?php print $validaMail_ER; ?>);
if(typeof(mail) == "string"){
if(er.test(mail)){ return true; }
}else if(typeof(mail) == "object"){
if(er.test(mail.value)){
return true;
}
}else{
return false;
}
}
</js>
Espero ter sido clado...
Algo assim poderia ser mais simples de alterar futuramente, e tbm teria os dois metodos de validação iguais...
aí não... são linguagens diferentes, com sintaxes e funções diferentes
você pode fazer só uma função PHP e requisitar via ajax com JS. mas para coisa simples assim não compensa
outra saída seria criar uma biblioteca em C, por exemplo, compilá-la em um arquivo objeto e carregá-la para que seja executada tanto no PHP como no JS. Não sei se é possível fazer isso com JS, mas no PHP dá - afinal, as libs do PHP são escritas em C, na sua maioria
Ler sobre bibliotecas estáticas, compartilhadas e dinâmicas pode lhe interessar. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Detalhe: uma ER só suporta no máximo 10 grupos, ou seja, 10 aberturas de parênteses...
Foi mal, não consegui responder antes. Beraldo muito obrigado, vou fazer os testes aqui e o aprimoramento, foi de grande ajuda, mas eu volto para passar o código. Ah, valeu pela dica Rick.hjpbarcelos, não sabia disso.
=========================================================================== 9 hours later ==========
Voltei. Ficou perfeito, bati um pouco a cabeça, mas consegui fazer, o único porém é que não usei de todo regexp para fazer isso, na verdade, fiz apenas uma aplicação simples de regexp, o resto é tudo na unha da linguagem mesmo.
Mas no fim, a string abaixo:
"((((((((abc(t))(dfg(t)) )\\()()() (hij) t(k) -f(-f(s)) -f(t) (u) -h(l) (((s))) x((t)(h)))"
é repartida e transformada na seguinte array:
["abc","t","dfg","t"," ","("," ","hij"," ","t","k"," ","-f(-f(s))"," ","-f(t)"," ","u"," ","-h","l"," ","s"," ","x","t","h"]
Diga-me se não ficou perfeito? :Drs
Bom, então, o código para esse resultado ficou assim, só não é PHP, é JavaScript mesmo:
function split_parentheses(string) {
var explode = string.split(/([\(\)])|(\s+)/);
var left = right = i = 0, path = '', ret = [], is_function = false, part, is_invalid = false, is_space = false;
for( i in explode ) {
part = explode[i];
if( part == '' ) continue;
if( part.replace( /\s+/, '' ) == '' ) {
if( is_space ) {
ret[ret.length-1] += part;
continue;
} else is_space = true;
} else if( is_invalid || !( part == '(' || part == ')' ) )
is_space = false;
if( part == '\\' )
if( is_invalid = !is_invalid )
continue;
if( part == '-f' && !is_function ) {
path = part;
is_function = true;
continue;
}
if( is_function && left <= 0 && part != '(' ) {
ret.push( path );
path = '';
is_function = false;
left = right = 0;
}
if( part == '(' || part == ')' ) {
if( is_invalid ) {
ret.push( part );
is_invalid = false;
continue;
}
if( !is_function )
continue;
( part == '(' ) ? left++ : right++;
}
if( is_invalid ) {
ret.push( '\\' );
is_invalid = false;
}
if( !is_function ) {
ret.push( part );
continue;
}
if( left <= 0 ) {
ret.push(path);
ret.push(part);
continue;
}
if( ( left == 0 && right == 0 ) || left < right )
ret.push( part );
else if( left > right )
path += part;
else if( left > 0 && left == right ) {
path += part;
ret.push( path );
path = '';
is_function = false;
left = right = 0;
}
} return ret;
}
arr = split_parentheses('((((((((abc(t))(dfg(t)) )\\()()() (hij) t(k) -f(-f(s)) -f(t) (u) -h(l) (((s))) x((t)(h)))');
alert(arr);
Enfim, valeu a todos pelos “toques”, em especial o Beraldo, foi de grande ajuda.
Peço ao moderador, que se possível, transfira esse tópico para o fórum de JavaScript. Vlw.
Leia o tópico abaixo:
http://forum.imasters.com.br/index.php?/topic/375800-orientacoes-para-uma-boa-participacao/