php regex para extrair dados da tabela HTML

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:


  • então, qualquer número de espaços
  • então

  • então o que você deseja capturar
  • então
  • e o mesmo novamente
  • e, finalmente,

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);