braindeaf

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

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

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

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.

al2o3cr

al2o3cr

String.replace with a Regex uses Regex.replace under the hood, but the declaration of String.replace specifically narrows the allowed type of the function. Looks like it’s been that way since the feature was added:

Using Regex.replace directly should do what you want.

Where Next?

Popular in Questions Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
Werner
Hi, I’m using Ubuntu 18.04 and after updating to OTP-24.0 yesterday i have this warning when I run “mix local.hex”: 14:57:30.512 [warn] ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
Codball
Mix format works fine if run from the cmd. I’ve followed this to facilitate the implementation into VSC which involves downloading an ext...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New

Other popular topics Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

We're in Beta

About us Mission Statement