Otrzymuję ciąg z zapytania do bazy danych, a następnie usuwam wszystkie znaczniki HTML, powroty karetki i znaki nowej linii, zanim umieszczę je w pliku CSV. Chodzi tylko o to, że nie mogę znaleźć sposobu na usunięcie nadmiaru białych znaków spomiędzy ciągów.
Jaki byłby najlepszy sposób na usunięcie wewnętrznych białych znaków?
Odpowiedzi:
Nie wiesz dokładnie, czego chcesz, ale oto dwie sytuacje:
Jeśli jesteś po prostu do czynienia z nadmiarem whitespacena początku lub na końcu łańcucha można użyć
trim()
,ltrim()
lubrtrim()
go usunąć.Jeśli masz do czynienia z dodatkowymi spacjami w ciągu, rozważ
preg_replace
wielokrotność whitespaces" "*
z pojedynczą whitespace" "
.Przykład:
$foo = preg_replace('/\s+/', ' ', $foo);
źródło
$foo = preg_replace( '/\s+/', ' ', $foo );
zabije efektynl2br()
$str = str_replace(' ','',$str);
Lub zastąp podkreśleniem & nbsp; itd itd.
źródło
Hi Earth
z 4 przestrzenie pomiędzy nimi będzie:HiEarth
. To nie rozwiązuje mojego problemu związanego z pytaniem.$str = trim(preg_replace('/\s+/',' ', $str));
Powyższy wiersz kodu usunie dodatkowe spacje, a także spacje wiodące i końcowe.
źródło
żaden z innych przykładów nie działał dla mnie, więc użyłem tego:
trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))
spowoduje to zastąpienie wszystkich tabulatorów, nowych linii, podwójnych spacji itp. prostą 1 spacją.
źródło
\s+
. Chociaż było to w 2014 roku, więc może zostało zmienione, nie dotykałem PHP przez ostatnie 3 lata, nie mogę komentować, ale pozostawi aktualną odpowiedź, gdy było to rozwiązanie i może nadal być w niektórych przypadkach.Jeśli chcesz zamienić tylko wiele spacji w ciągu, na przykład:
"this string have lots of space . "
I oczekujesz odpowiedzi"this string have lots of space"
, możesz użyć następującego rozwiązania:$strng = "this string have lots of space . "; $strng = trim(preg_replace('/\s+/',' ', $strng)); echo $strng;
źródło
Istnieją luki bezpieczeństwa w używaniu preg_replace (), jeśli otrzymujesz ładunek z danych wejściowych użytkownika [lub innych niezaufanych źródeł]. PHP wykonuje wyrażenie regularne za pomocą eval (). Jeśli przychodzący ciąg nie jest prawidłowo oczyszczony, aplikacja może zostać poddana wstrzyknięciu kodu .
W mojej własnej aplikacji, zamiast zawracać sobie głowę oczyszczaniem danych wejściowych (i ponieważ mam do czynienia tylko z krótkimi ciągami znaków), zamiast tego utworzyłem nieco bardziej intensywną funkcję procesora, która jest jednak bezpieczna, ponieważ niczego nie eval ().
function secureRip(string $str): string { /* Rips all whitespace securely. */ $arr = str_split($str, 1); $retStr = ''; foreach ($arr as $char) { $retStr .= trim($char); } return $retStr; }
źródło
$str = preg_replace('/[\s]+/', ' ', $str);
źródło
Możesz użyć:
$str = trim(str_replace(" ", " ", $str));
To usuwa dodatkowe spacje z obu stron ciągu i konwertuje dwie spacje na jedną w ciągu. Zwróć uwagę, że nie spowoduje to konwersji trzech lub więcej spacji z rzędu na jedną! Innym sposobem, który mogę zasugerować, jest użycie implodowania i eksplozji, które jest bezpieczniejsze, ale całkowicie nieoptymalne!
$str = implode(" ", array_filter(explode(" ", $str)));
Moją sugestią jest użycie natywnej pętli for lub użycie regex do tego rodzaju pracy.
źródło
Aby rozwinąć odpowiedź Sandipa, w dziennikach pojawiło się kilka ciągów znaków, które zostały błędnie zakodowane w bit.ly. Chcieli zakodować tylko adres URL, ale po spacji umieścili uchwyt twittera i kilka innych rzeczy. Wyglądało to tak
? productID =26%20via%20@LFS
Zwykle nie stanowi to problemu, ale otrzymuję wiele prób iniekcji SQL, więc przekierowuję wszystko, co nie jest prawidłowym identyfikatorem, na 404. Użyłem metody preg_replace, aby przekształcić nieprawidłowy ciąg productID w ciąg prawidłowy identyfikator produktu.
$productID=preg_replace('/[\s]+.*/','',$productID);
Szukam spacji w adresie URL, a następnie usuwam wszystko po nim.
źródło
Niedawno napisałem prostą funkcję, która usuwa nadmiar białych znaków z łańcucha bez wyrażeń regularnych
implode(' ', array_filter(explode(' ', $str)))
.źródło
$str = "I am a PHP Developer"; $str_length = strlen($str); $str_arr = str_split($str); for ($i = 0; $i < $str_length; $i++) { if (isset($str_arr[$i + 1]) && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) { unset($str_arr[$i]); } else { continue; } } echo implode("", $str_arr);
źródło