2012-03-03 8 views
1

데이터베이스에 미리 알림을 추가하는 빠른 방법으로 트윗을 파싱 중입니다. 트윗은 다음과 같이 보일 것이다 : 나는 #, @를 얻기 위해 다음과 같은 정규식을 사용하고정규식이 일치하지 않는 데이터는 어떻게 얻습니까?

$tweet = '#notes @username !high_priority [Project Name] Tweet content'; 

! 와 [프로젝트]

$match = preg_match_all('/(#\\w*[a-zA-Z_]+\\w*)|(!\\w*[a-zA-Z_]+\\w*)|(@\\w*[a-zA-Z_]+\\w*)|(\\[[^\\]]*\\])/i', 
    $tweet, 
    $matches); 

나는 또한 나머지 "트윗 내용을"얻는 방법을 알고 싶어요, 그래서 정규식과 일치 does't 모든 변수에 저장해야합니다. 또한

, 윌 트윗이 더 같은 경우 경기 순서 사항 :

$tweet = '@username Tweet content [Project Name] #notes !high_priority'; 

사람이 그 작업을 수행하는 방법을 알고 있나요?

+1

'\ w'은 무엇이라고 생각하십니까? '[a-zA-Z]'와 거의 같습니다. – Vyktor

+0

일치를 반복하고 #, @,!로 시작하지 않는 모든 일치에서 문자열을 구성하십시오. & [ – Yaniro

답변

2

정규식이 일치하는 텍스트를 빈 문자열로 바꿉니다. 남은 것은 정규식과 일치하지 않는 것입니다.

+0

나는 이것을 사용하고있다 : '$ content = preg_replace ('/ (# \ w * [a-zA-Z _] + \\ w *) | (! \\ w * [a-zA- ] + \ w *) | (\\ w * [a-zA-Z _] + \\ w *) | (\\ [[^ \\]] * \\])/i ',' ', $ 제목); ' 나머지 공백을 자르면됩니다. –

0

preg_match_all 대신 preg_split을 사용하면 단일 문자열을 반환하는 Brent의 대답에 대한 대안으로 모든 구성 요소가 중간에 전달됩니다. 많은 일치 항목이 비어있을 수 있습니다.

+0

'preg_match'를 사용하여 일치하는 항목을 반복적으로 처리하는 답변을 입력하고 문자열을 복사하지 않고 데이터를 검색하기 위해 오프셋을 저장했지만이 경우에는 너무 무겁습니다. 로마에는 여러 가지 방법이 있습니다. –

0

이 코드를 테스트하지는 않았지만이 정규 표현식이 아닌 생각이 더 잘 작동한다고 생각합니다. 기본적으로 문자열을 공백으로 분리 한 다음 각 부분을 구문 분석합니다. 이 접근법은 어떤 순서의 부품이든 상관 없다는 것을 의미합니다.

콘텐츠와 프로젝트가 여러 조각으로 나뉠 수 있기 때문에 조금 까다로울 수는 있지만 코드에서 처리해야합니다. 또한 해시 태그, 사용자, 프로젝트 및 트윗 별 우선 순위가 하나만 있다고 가정합니다. 예를 들어 해시 태그가 여러 개있는 경우 문자열 대신 배열에 입력하면됩니다. 마지막으로 이상한 일들을 감지/방지하는 오류 처리 기능이 없습니다.

여기 내 검증되지 않은 코드입니다 : 나는 당신이 사용할 때 당신이 당신의 정규식에 오류가 있다고 생각

$data = array(
    'hash' => '', 
    'user' => '', 
    'priority' => '', 
    'project' => '', 
    'content' => '' 
); 

$parsingProjectName = false; 
foreach(explode(' ', $tweet) as $piece) 
{ 
    switch(substr($piece, 0, 1)) 
    { 
     case '#': 
      $data['hash'] = substr($piece, 1); 
      break; 
     case '@': 
      $data['user'] = substr($piece, 1); 
      break; 
     case '!': 
      $data['priority'] = substr($piece, 1); 
      break; 
     case '[': 
      // Check if the project name is longer than 1 word 
      if(strpos($piece, -1) == ']') 
      { 
       $data['project'] = substr($piece, 1, -1); 
      } 
      else 
      { 
       // There will be more to parse in the next piece(s) 
       $parsingProjectName = true; 
       $data['project'] = substr($piece, 1) . ' '; 
      } 
      break; 
     default: 
      if($parsingProjectName) 
      { 
       // Are we at the end yet? 
       if(strpos($piece, -1) == ']') 
       { 
        // Yes we are 
        $data['project'] .= substr($piece, 1, -1); 
        $parsingProjectName = false; 
       } 
       else 
       { 
        // Nope, there is more 
        $data['project'] .= substr($piece, 1) . ' '; 
       } 
      } 
      else 
      { 
       // We aren't in the middle of parsing the project name, and this piece doesn't start with one of the special chars, so assume it is content 
       $data['content'] .= $piece . ' '; 
      } 
    } 
} 

// There will be an extra space on the end; remove it 
$data['content'] = substr($data['content'], 0, -1); 
+0

BTW 내 substr 사용을 다시 확인해야 할 수도 있습니다. 첫 번째 문자, 마지막 문자를 확인하고 첫 번째 또는 마지막 문자를 제외한 모든 것을 가져옵니다.그것이 의미가 있고 작동하기를 바랍니다 : P –

0

\ w이 일치 w \ 반면 공백을 맞게 원하는 모양 [A-ZA-Z_] 전 단어 - 문자. 당신은 (이 작은 부분에 대한) 그런 식으로 할 수있는 : 이미 다른 부분을 얻을 수있는 경기를 반복 할 것으로

...\\s*[\\w_]+\\s*... 

, 당신은 당신이 원하는 일반 텍스트에 대한 하위 패턴을 만들 수 있습니다 일치하거나 패턴의 나머지 부분과 연결하십시오. 이 방법을 사용하면 하나의 추가 일치가 생깁니다. 이것은 매치 부분을 루핑하는 동안 매치 된 부분을 구별하는 한 다른 내용의 순서에서도 작동합니다.

관련 문제