Estou tentando fazer uma regex por tirar alguns dados de uma tabela.
O código que eu tenho agora é:
quote1 have you trying it off and on again ? quote65 You wouldn't steal a helmet of a policeman
Isso eu quero replace por:
Quote1: você tentou de novo e de novo?
Quote65: você não roubaria um capacete de um policial
O código que já escrevi é o seguinte:
%((?s).*?) %
Mas agora estou preso.
A regex de Tim provavelmente funciona, mas você pode querer considerar usar a funcionalidade DOM do PHP em vez da regex, pois pode ser mais confiável ao lidar com pequenas mudanças na marcação.
Veja o método loadHTML
Se você realmente quer usar regexes (pode estar OK se você realmente tiver certeza de que sua string sempre será formatada assim), e quanto a algo assim, no seu caso:
$str = < < quote1 have you trying it off and on again ? quote65 You wouldn't steal a helmet of a policeman A; $matches = array(); preg_match_all('#\s+?(.*?) \s+?(.*?) \s+? #', $str, $matches); var_dump($matches);
Algumas palavras sobre a regex:
E eu uso:
?
no regex para combinar no modo não ganancioso preg_match_all
para obter todas as partidas Você então obtém os resultados desejados em $matches[1]
e $matches[2]
(não $matches[0]
) ; Aqui está a saída do var_dump
que usei (eu removi a input 0, para torná-la mais curta) :
array 0 => ... 1 => array 0 => string 'quote1' (length=6) 1 => string 'quote65' (length=7) 2 => array 0 => string 'have you trying it off and on again ?' (length=37) 1 => string 'You wouldn't steal a helmet of a policeman' (length=42)
Você só precisa manipular essa matriz, com alguma concatenação de strings ou similares; por exemplo, assim:
$num = count($matches[1]); for ($i=0 ; $i< $num ; $i++) { echo $matches[1][$i] . ':' . $matches[2][$i] . '
'; }
E você obtém:
quote1:have you trying it off and on again ? quote65:You wouldn't steal a helmet of a policeman
Nota: você deve adicionar algumas verificações de segurança (como preg_match_all
deve retornar verdadeiro, a contagem deve ser pelo menos 1, …)
Como uma nota lateral: usar regex para analisar HTML geralmente não é uma boa idéia ; Se você puder usar um analisador real, deve ser muito mais seguro …
Como de costume, extrair texto de HTML e outros idiomas não regulares deve ser feito com um analisador – os regraxos podem causar problemas aqui. Mas se você tem certeza da estrutura de seus dados, você poderia usar
%((?s).*?) \s*((?s).*?) %
para encontrar os dois textos. \ 1: \ 2 seria então a substituição.
Se o texto não pode abranger mais de uma linha, você ficaria mais seguro deixando os bits (?s)
…
Não use o regex, use um analisador HTML. Tal como o PHP HTML Simple HTML Parser
Extraia cada conteúdo de
preg_match_all("%\%", $respose, $mathes); var_dump($mathes);