2011-03-20 4 views
0

안녕하세요, 저는 입력을 줄 단위로 나누고 각 줄마다 trim()을 사용하려고합니다. 하지만 트림을 사용하지 않고 그것을 수행하고 싶습니다. 그냥 정규식을 사용하십시오.PHP preg regex - 여러 줄 모드에서 줄 바꿈이없는 whitspaces 그룹

이 문제는 내가 줄을 감쌌다. 내 그룹 [^ $ \ s]이 공백이지만 줄 바꿈이 작동하지 않는다고 생각합니다.

그래서 문제는 내 문제를 해결하는 방법과 명시 적으로 줄 바꿈을 무시한다고 말하는 preg regex에서 그룹을 정의하는 것입니다. 지금은 내 접근 방식이 여전히 잘못이라고 생각하고 있습니다. 이 이상한 그룹 대신 \ s *를 쓰면 문제가 생깁니다. . + 모두 먹는다. 내가 쓴다면. +? 공백이 포함 된 문자열은 완성되지 않습니다.

preg_match_all("/^\s*+(.+)[^$\s]*+$/m", $_POST['input'], $matches, PREG_SET_ORDER); 
+0

놀라운 점은 무엇입니까? 이렇게하면 해결할 수 있습니다. /^\s*+(.+?)\s*$/m –

+0

그래, 그냥'. +? '덜 욕심. 그런데 왜 손질을 피하기를 원했습니까? – mario

+0

나는 선을 다듬고 싶었다. 그렇지 않으면 어쨌든 너무 쉬웠을 것이다. –

답변

0

좋아요, 저는 보통 정규식을 사용합니다. 그러나 여기서 trim 접근법은 더 간단합니다. 그리고 대개는 여분의 루프가 필요하기 때문에 회피했다고 가정합니다. 당신이 선택적으로 사용할 수도

$lines = array_map("trim", explode("\n", $_POST["input"])); 
// quite a handy utility function, so just wanted to note that here 

하지만 당신의 발견 솔루션에 대한 대안으로 :하지만이 경우에 당신은 그것을 압축 할 수

preg_split('/((?!\n)\p{Z})*\n((?!\n)\p{Z})*/u', "...\n..."); 

비트 hackish 지금. \n에 대해 ^$을 바꿔서 사용하고 어설 션을 사용하여 다른 곳에서 개행을 제외했습니다. 그러나 \p{Z}은 NBSP와 다른 닌자 자리 표시자를 포함한 모든 유니 코드 공간 문자 변형을 잡는 좋은 대안입니다.

0
preg_match_all("/\s*(.*\S)/", $_POST['input'], $matches, PREG_SET_ORDER); 

전체 줄을 포함하여 캡처 그룹 앞에 공백을 넣으려면 뭔가가 필요합니다. \s*입니다. 줄 시작 부분에 강제로 시작할 필요는 없으며, 어쨌든 저장하지 않습니다. 유일한 목적은 비 공백 문자 바로 앞까지 일치시키는 것입니다.

이제는 공백이 아닌 것을 보았고 같은 줄의 공백이 아닌 공백까지 캡처해야한다는 것을 알고 있습니다. .은 개행과 일치하지 않으므로 .*\S은 그 일을 수행합니다.

귀하의 버전과의 한 가지 다른 점은 다음 경기의 초기 \s*이 방금 일치시킨 행간의 공백을 먹게된다는 것입니다. 더 이상 라인 결말에 신경 쓰지 않으므로 /m 수식어는 더 이상 필요하지 않습니다.

첫 번째 별을 소유 할 수 있습니다 (\s*+). 그것은 일치하는 것을 변경하지 않을 것이지만 긴 빈 꼬리가 있으면 파일의 끝에서 약간 더 빨리 실패 할 것입니다.