braindeaf
String.replace with anonymous function with multiple matches
I wonder if I can ask a newbie question, maybe..I’m trying to replace
<source>SOMETHING</source>
with
<code><pre>SOMETHING</pre></code>
So I can replace the entire match
iex(14)> String.replace("<source>(aaaM)</source>", ~r/<source>(.*)<\/source>/, fn match-> "<code><pre>#{match}</pre></code>" end)
**"<code><pre><source>(aaaM)</source></pre></code>"**
But I need access to the first matched element, so (aaaM). Partly because I also want to HTML Escape it as well. Ok, I need to use the match in anonymous function…but..sadly.
iex(15)> String.replace("<source>(aaaM)</source>", ~r/<source>(.*)<\/source>/, fn match, code-> "<code><pre>#{match}</pre></code>" end)
warning: variable "code" is unused (if the variable is not meant to be used, prefix it with an underscore)
iex:15
** (FunctionClauseError) no function clause matching in String.replace/4
The following arguments were given to String.replace/4:
# 1
"<source>(aaaM)</source>"
# 2
~r/<source>(.*)<\/source>/
# 3
#Function<43.65746770/2 in :erl_eval.expr/5>
# 4
[]
Attempted function clauses (showing 1 out of 1):
def replace(subject, pattern, replacement, options) when is_binary(subject) and is_binary(replacement) or is_function(replacement, 1) and is_list(options)
(elixir 1.13.1) lib/string.ex:1477: String.replace/4
I’m not sure I follow, I’m now supplying 4 arguments. Even if I parenthesises the multiple arguments for the anonymous function. Anyone point out where I am being a dummy?
Many thanks
RobL
Most Liked
LostKobrakai
There is the function raw/1, but that also just wraps data into a {:safe, …} tuple. There’s no :raw tagged tuple support afaik.
jazzyer
I’m not sure I fully understand what you want to do, but this example might give you a sense:
def replace_characters(string) do
to_replace = ["&", "<", ">", "/", "'"]
String.replace(string, to_replace, fn
"&" -> "H"
"<" -> "E"
">" -> "L"
"/" -> "L"
"'" -> "O"
end)
end
iex::1> Module.replace_characters("fdsfd &<>/' dsfds")
"fdsfd HELLO dsfds"
Anonimous function is arity 1, that’s why it complains.
TheMaikXX
Hello, just a note. The function Phoenix.HTML.html_escape does always return {:safe, content} according to the spec. Because if it finds code, that needs to be escaped, it escapes it.. That tuple is for phoenix rendering where you put this tuple into template, informing it that the given content is already escaped.
There is also {:raw, content} that tells phoenix that you insist on putting the content into final result as-is.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









